38

关于使用 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”和消息“错误文档错误”

我不能从文档中抓取一个节点,克隆它,然后将它附加到另一个文档吗?

4

2 回答 2

59

用于DOMDocument->importNode在将节点添加到 DOM 之前将其导入其他文档。

于 2009-11-18T21:24:13.030 回答
3

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

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

如果您需要导入节点,它的所有子节点(以递归方式)和/或节点的属性使用可选的第二个参数deep

if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
    $root2->appendChild($importedNode);
}
于 2017-08-18T22:53:25.530 回答