方法: DOMNode::cloneNode()
概述: cloneNode()
方法用于克隆节点。它创建并返回当前节点的一个副本,包括其所有的属性以及子节点。
语法: DOMNode::cloneNode(bool $deep = true): DOMNode|false
参数:
$deep
(可选): 指定是否克隆节点的所有子节点。默认值为true
,表示克隆整个子树。如果设置为false
,则只克隆当前节点。
返回值:
- 成功时返回
DOMNode
对象,表示克隆的节点。 - 如果克隆节点失败,则返回
false
。
示例:
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="1">Apple</item>
<item id="2">Banana</item>
</root>';
$dom = new DOMDocument();
$dom->loadXML($xml);
$items = $dom->getElementsByTagName('item');
foreach ($items as $item) {
$cloneNode = $item->cloneNode();
$cloneNode->setAttribute('id', 'new_' . $item->getAttribute('id'));
$cloneNode->nodeValue = 'New ' . $item->nodeValue;
$dom->documentElement->appendChild($cloneNode);
}
echo $dom->saveXML();
解释:
以上示例中,我们使用 cloneNode()
方法克隆了 <item>
节点并向其添加了一个新的标识符以及修改了节点值。然后,我们将克隆的节点添加到 <root>
元素中。
输出结果:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="1">Apple</item>
<item id="2">Banana</item>
<item id="new_1">New Apple</item>
<item id="new_2">New Banana</item>
</root>
注意事项:
- 克隆节点后,它并不会自动添加到原始文档中。必须通过
appendChild()
或类似的方式将其添加到适当的位置。 - 克隆节点是深度克隆的,默认情况下会包括所有子节点。如果只想克隆当前节点而不复制其子节点,可以将
$deep
参数设置为false
。 - 克隆节点时,会复制节点的属性以及子节点。任何事件监听器、数据存储或其他附加数据都不会被克隆。