web-dev-qa-db-ja.com

DOMElementのクローン作成と追加: '間違ったドキュメントエラー'

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」

ドキュメントからノードを取得してクローンを作成してから、別のドキュメントに追加することはできませんか?

29
Peter Bailey

使用する - DOMDocument->importNode DOMに追加する前に、ノードを他のドキュメントにインポートします。

48
Gumbo

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);
}
0
halfpastfour.am