【PHP】SimpleXMLを使ってXMLを直感的に操作

ここの続き。PHP5のDOMでXMLを操作するときにXpathの記述方法のめんどくささに萎える。JavaScriptみたいにselectSingleNodeとかselectNodesとか書きたくなるけど、これができない。

DOMXpathを使うとこんな感じ

$objDom = new DOMDocument();
$objDom->preserveWhiteSpace = false; //余分な空白を取り除く.
$objDom->load('sample.xml');

$objXpath = new DOMXPath($objDom);
$sQuery = '//root/comment';
$objSelectNodes = $objXpath->query($sQuery);
echo $objSelectNodes->item(0)->nodeValue;

echo $objSelect->item(0)->getAttribute('id');

Xpathを記述しようと思うだけで別のオブジェクトを生成しないといけないので、非常にめんどくさい。

こういう場合はSimpleXMLを使うと非常に分かりやすくなる。上のコードをSimpleXMLを使って書くとこんな感じ

$objDom = new DOMDocument();
$objDom->preserveWhiteSpace = false; //余分な空白を取り除く.
$objDom->load('sample.xml');

//SimpleXMLの方が扱いやすいので変換.
$objXml = simplexml_import_dom($objDom);
$sQuery = '/root/comment';
$objSelectNodes = $objXml->xpath($sQuery); //配列で返る.
echo $objSelectNodes[0];       //nodeValueへの参照.
echo $objSelectNodes[0]['id']; //id属性への参照.

ここまでのコード量は変わらない・・・けど、ここからさらにxpathで別エレメントをselectして記述していくと違いが分かってくる。SimpleXMLの場合はノードを連想配列で返してくれるので、nodeValueへの参照と属性への参照が直感的に扱えて分かりやすい。

ただXMLファイルを読み込むときはpreserveWhiteSpaceみたいなことができないみたいなので、DOMとSimpleXMLを組み合わせた方がよさそう。

コメント

このブログの人気の投稿

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

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

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