2009-11-18 29 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); 
}