PHPのDOMAPIを使用したノードのクローン作成について私が完全に理解していないことがあります。これは私が遭遇している問題をすばやく複製するサンプルファイルです。
$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」とメッセージ「WrongDocumentError」
ドキュメントからノードを取得してクローンを作成してから、別のドキュメントに追加することはできませんか?
使用する - DOMDocument->importNode
DOMに追加する前に、ノードを他のドキュメントにインポートします。
importNode
メソッドの結果をDOMに追加する必要があります。インポートできない場合、メソッドがfalseを返す可能性があることに注意してください
if ($importedNode = $doc2->importNode($root->cloneNode())) {
$root2->appendChild($importedNode);
}
ノードをインポートする必要がある場合、そのすべての子ノード(resursively)および/またはノードの属性はオプションの2番目のパラメーターdeep
を使用します。
if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
$root2->appendChild($importedNode);
}