2009-11-18 62 views
26

有一些我不完全理解与PHP的DOM api的节点克隆。这里有一个快速重复我遇到的问题的示例文件。DOMElement克隆和追加:'错误的文档错误'

$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()); 

当你运行这个小片段抛出一个异常

Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error'

我不能抓住从一个文档中的节点,克隆它,然后将其追加到另一个文件?

回答

39

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

+0

完美,谢谢。我正在通过'DOMNode'和'DOMElement' API寻找能够让我这么做(愚蠢地)从未检查过'DOMDocument'方法的东西=/ – 2009-11-18 21:31:00

+1

你在哪里添加了importNode?我将它添加到我的代码中,但仍然出现错误。 – NobleUplift 2014-01-08 17:54:05

+0

@NobleUplift您需要调用'importNode'将一个节点从一个文档导入到另一个文档。之后,你可以把它作为你想要的孩子追加。 – Gumbo 2014-01-08 18:42:05

0

您必须将importNode方法的结果追加到DOM。请记住,如果您需要导入节点的方法可以返回false,如果它不能被导入

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

,它的所有子节点(resursively)和/或节点的属性,使用可选的第二个参数deep

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