DOM元素克隆和追加:“错误的文档错误”

2022-08-30 12:27:45

关于使用PHP的DOM API进行节点克隆,我并不完全了解一些东西。下面是一个示例文件,可以快速复制我遇到的问题。

$doc  = new DOMDocument( '1.0', 'UTF-8' );
$root = $doc->createElement( 'root' ); // This doesn't work either $root = new DOMElement( 'root' );
$doc->appendChild( $root );

$doc2  = new DOMDocument( '1.0', 'UTF-8' );
$root2 = $doc2->createElement( 'root2' );
$doc2->appendChild( $root2 );

// Here comes the error
$root2->appendChild( $root->cloneNode() );

运行此小代码段时,将引发异常

致命错误:未捕获的异常“DOMException”,并显示消息“错误的文档错误”

我是否可以不从文档中获取节点,克隆它,然后将其附加到另一个文档?


答案 1

使用 DOMDocument->importNode 将节点导入另一个文档,然后再将其添加到 DOM 中。


答案 2

您必须将 importNode 方法的结果追加到 DOM 中。请记住,当无法导入时,该方法可能会返回 false。

if ($importedNode = $doc2->importNode($root->cloneNode())) {
    $root2->appendChild($importedNode);
}

如果需要导入节点,则其所有子节点(令人放心)和/或节点的属性都使用可选的第二个参数:deep

if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
    $root2->appendChild($importedNode);
}

推荐