【PHP】【DOM】ノードをコピーする方法

PHPのDOMを使ってXMLを操作していると、別々に作ったDOMを一つのノードにまとめたい場合があります。cloneNodeとか使って簡単にできるかと思ったけど、ちょっとつまずいたのでメモ。

最初に書いたコード↓

$objDom2 = new DOMDocument();
$objDom2->encoding = 'UTF-8'; 
//文字化け対策.
$objDom2->formatOutput = true;  //字下げや空白を考慮してきれいに整形した出力を行う。.
$objNode = $objDom2->appendChild( $objDom2->createElement('copy') );
$objNode->appendChild( $objAddNode->cloneNode(true) );
echo $objDom2->saveXML();

単純にもう一つDOMドキュメントを作ってコピーしたいノードをcloneNodeを使って追加しようとしてる。しかし、これだと'Wrong Document Error'で怒られる・・・。JavaScriptだとできたのに・・・。

調べてみるとimportNodeを使って、現在のDOMドキュメントに関連づけを変更しないと追加できないみたい。

修正したコード↓

$objDom2 = new DOMDocument();
$objDom2->encoding = 'UTF-8';
//文字化け対策.
$objDom2->formatOutput = true;  //字下げや空白を考慮してきれいに整形した出力を行う。.
$objNode = $objDom2->appendChild( $objDom2->createElement('copy') );
$objNewNode = $objDom2->importNode( $objAddNode, true );
$objNode->appendChild( $objNewNode );
echo $objDom2->saveXML();

JavaScriptのDOMになれてるとなかなか気付かないかも。