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
6 年前
如果您想将一个节点的子节点移动到另一个节点,您不能简单地迭代 $element->childNodes - 您必须先创建一个数组

<?php
$children
= [];
foreach (
$elemWithChildren->childNodes as $child) {
$children[] = $child;
}
foreach (
$children as $child) {
$targetElement->appendChild($child);
}
?>
3
frame at dynamiccreated dot de
13 年前
注意处理 DOMNodeList 和同一个节点上的 appendChild()。

如果您只想替换子节点,而不是 DOMElement 本身,您可能要遍历 childNodes 属性,或者使用 DOMNodeList 的 for 循环和 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