2009-11-18 11 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'メソッドをチェックしませんでした=/ –

+1

importNodeをどこに追加しましたか?私はそれを私のコードに加えましたが、私はまだエラーが発生しています。 – NobleUplift

+0

@NobleUpliftあるドキュメントから別のドキュメントにノードをインポートするには、 'importNode'を呼び出す必要があります。その後、あなたが望む場所に子供として追加することができます。 – Gumbo

0

importNodeメソッドの結果をDOMに追加する必要があります。それは

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

ノードをインポートする必要がある場合は、それがすべての子ノード(resursively)だ、および/またはノードの属性は、オプションの二番目のパラメータdeepを使用し、インポートすることができないときにメソッドがfalseを返すことができることに注意してください:

if ($importedNode = $doc2->importNode($root->cloneNode(), true)) { 
    $root2->appendChild($importedNode); 
} 
関連する問題