38

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」

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

4

2 に答える 2

59

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

于 2009-11-18T21:24:13.030 に答える
3

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);
}
于 2017-08-18T22:53:25.530 に答える