PHP Conference Japan 2024

DOMNode::appendChild

(PHP 5, PHP 7, PHP 8)

DOMNode::appendChild 在子節點的末端加入新的子節點

描述

public DOMNode::appendChild(DOMNode $node): DOMNode|false

這個函式會將子節點附加到現有的子節點列表,或是建立新的子節點列表。子節點可以使用 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();
?>

參見

新增註解

使用者貢獻的註解 4 則註解

19
krisdover at hotmail dot com
16 年前
這裡沒有提到的是,DOMNode::appendChild() 也可以用來將現有的節點移動到 DOMDocument 的另一個部分,例如:

<?php
$doc
= new DOMDocument();
$doc->loadXML("<foobar><bar/><foo/></foobar>");
$bar = $doc->documentElement->firstChild;
$foo = $doc->documentElement->lastChild;
$foo->appendChild($bar);
print
$doc->saveXML();
?>

這會產生

<?xml version="1.0"?>
<foobar><foo><bar/></foo></foobar>

請注意,節點「<foo/>」和「<bar/>」是同層級的節點,也就是「<foobar>」的第一個和最後一個子節點,但使用 appendChild(),我們可以移動「<bar/>」,使其成為「<foo/>」的子節點。

這可以讓您省去在將「<bar/>」附加為「<foo/>」的子節點之前,先使用 DOMNode::removeChild($bar) 移除「<bar/>」的麻煩。

Kris Dover
8
cweiske at php dot net
7 年前
如果您想將一個節點的子節點移動到另一個節點,您不能直接在 $element->childNodes 上迭代 - 您必須先建立一個陣列

<?php
$children
= [];
foreach (
$elemWithChildren->childNodes as $child) {
$children[] = $child;
}
foreach (
$children as $child) {
$targetElement->appendChild($child);
}
?>
3
frame at dynamiccreated dot de
14 年前
請注意,在同一個節點上處理 DOMNodeList 和 appendChild() 時。

如果您只想取代子節點,而不是 DOMElement 本身,您可能會使用 foreach childNodes 屬性,或者使用 for 迴圈和 DOMNodeList 的 item() 方法取得 DOMElements。

如果您不複製接收到的單個 DOMElement,就會失敗。實際上,DOMNodelist 的計數會在 appendChild 計數時減少,但 appendChild 似乎會參考舊的 Nodelist,而不會發生任何可見的事情。複製會有幫助。
3
jrtayloriv at gmail dot com
16 年前
如果您想建立巢狀 DOM 元素

<?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();
?>

等同於

<foo>
<bar></bar>
<bazz></bazz>
</foo>
To Top