【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になれてるとなかなか気付かないかも。

コメント

このブログの人気の投稿

【.NET】DataGridViewを選択した際に背景色を変更しない

Can't open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

【PostgreSQL】ROWNUMのように行番号(現在行)を取得するROW_NUMBER