有些东西我不完全了解使用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',消息'错误 文件错误'
我是否可以从文档中获取节点,克隆它,然后将其附加到另一个文档?
答案 0 :(得分:48)
在将节点添加到DOM之前,使用DOMDocument->importNode
将节点导入到其他文档中。
答案 1 :(得分:0)
您必须将importNode
方法的结果附加到DOM。请记住,该方法在无法导入时可能会返回
if ($importedNode = $doc2->importNode($root->cloneNode())) {
$root2->appendChild($importedNode);
}
如果您需要导入节点,它的所有子节点(反复地)和/或节点的属性使用可选的第二个参数deep
:
if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
$root2->appendChild($importedNode);
}