DOMNode::appendChild
(PHP 5, PHP 7, PHP 8)
DOMNode::appendChild — 子要素群の最後に新しい子要素を追加する
説明
この関数は、既存の子要素のリストに新しい子要素を追加するか、 あるいは新しい子要素リストを作成します。子要素の作成には DOMDocument::createElement()、 DOMDocument::createTextNode() などを使用するか、単に別のノードを使用します。
既存のノードを使う場合、そのノードは移動します。
パラメータ
node
-
追加する子要素。
戻り値
追加したノードを返します。
エラーの場合は false
を返します。
エラー / 例外
DOM_NO_MODIFICATION_ALLOWED_ERR
-
ノードが読み込み専用であったり、挿入するノードの以前の親が 読み込み専用であったりした場合に発生します。
DOM_HIERARCHY_REQUEST_ERR
-
node
で指定した型の子ノードを 保持することが許可されていない場合、あるいは追加しようとしている ノードが自分自身やその祖先であった場合に発生します。 DOM_WRONG_DOCUMENT_ERR
-
node
が、このノードとは別の ドキュメントで作成されたものである場合に発生します。
例
以下の例は、新しいドキュメントに新しい要素を追加します。
例1 子要素の追加
<?php
$doc = new DOMDocument;
$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);
echo $doc->saveXML();
?>
例2 ネストされた子ノード
<?php
$doc = new DOMDocument;
$headNode = $doc->createElement("head");
$doc->appendChild($headNode);
$titleNode = $doc->createElement("title");
$headNode->appendChild($titleNode);
echo $doc->saveXML();
?>
参考
- DOMChildNode::after() - ノードの後ろにノードを追加する
- DOMNode::insertBefore() - 参照しているノードの前に新しい子を追加する
- DOMNode::removeChild() - 子要素群から子要素を削除する
- DOMNode::replaceChild() - 子を置き換える
+add a note
User Contributed Notes 4 notes
krisdover at hotmail dot com ¶
16 years ago
What's not mentioned here is that DOMNode::appendChild() can also be used to move an existing node to another part of the DOMDocument, e.g.
<?php
$doc = new DOMDocument();
$doc->loadXML("<foobar><bar/><foo/></foobar>");
$bar = $doc->documentElement->firstChild;
$foo = $doc->documentElement->lastChild;
$foo->appendChild($bar);
print $doc->saveXML();
?>
This produces:
<?xml version="1.0"?>
<foobar><foo><bar/></foo></foobar>
Note that the nodes "<foo/>" and "<bar/>" were siblings, i.e. the first and last child of "<foobar>" but using appendChild() we were able to move "<bar/>" so that it is a child of "<foo/>".
This saves you the trouble of doing a DOMNode::removeChild($bar) to remove "<bar/>" before appending it as a child of "<foo/>".
Kris Dover
cweiske at php dot net ¶
7 years ago
If you want to move the children of one node to another, you cannot simply iterate on $element->childNodes - you have to make an array first:
<?php
$children = [];
foreach ($elemWithChildren->childNodes as $child) {
$children[] = $child;
}
foreach ($children as $child) {
$targetElement->appendChild($child);
}
?>
frame at dynamiccreated dot de ¶
14 years ago
Aware dealing with DOMNodeList and appendChild() on the same Node.
If you want to replace only the children not the DOMElement itself you probably foreach childNodes-property or get the DOMElements with a for-loop and item()-method of the DOMNodeList.
You will fail if you not clone the received single DOMElement. Actually the count of the DOMNodelist will be decreased on appendChild count but appendChild seems to refer to the old Nodelist and nothing visible will happen. Cloning will help.
jrtayloriv at gmail dot com ¶
16 years ago
If you want to create nested DOM elements:
<?php
$doc = new DOMDocument();
$foo = $doc->createElement("foo");
$doc->appendChild($foo);
$bar = $doc->createElement("bar");
$foo->appendChild($bar);
$bazz = $doc->createElement("bazz");
$foo->appendChild($bazz);
echo $doc->saveXML();
?>
Is equivalent to:
<foo>
<bar></bar>
<bazz></bazz>
</foo>
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google