【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を組み合わせた方がよさそう。