一手間必要なPHPでのSimpleXML関数のパース処理
今回はPHPによるXMLデータのパース処理で気になったので、
それについての小ネタです。
まずは基本
PHP5でXMLデータを簡単にオブジェクト化してくれる
「SimpleXML」関数を利用します。
例えば
simplexml_load_file()
simplexml_load_string()
関数自体の細かい説明は省きますが、「simplexml_load_file()」は
XMLファイルからXMLデータを読みだしてオブジェクト化し、
「simplexml_load_string()」は形成されたXML文字列をオブジェクト化する
なんとも便利な関数です。
こんな感じに
$xml = simplexml_load_file('xml.xml');
print($xml);
結果
SimpleXMLElement Object ( [title] => LIG )
基本ができたところで
例えば次のようなXMLデータがあった場合はどうでしょう。
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>LIG</title>
<item>
<title>LIG Item01</title>
<g:id>91954</g:id>
<g:name>LIG Name01</g:name>
</item>
</channel>
</rss>
このXMLデータを「simplexml_load_string()」関数によってオブジェクト化した場合、
どうパースされるでしょう。
結果
SimpleXMLElement Object ( [@attributes] => Array ( [version] => 2.0 )=> SimpleXMLElement Object ( [title] => LIG [item] => SimpleXMLElement Object ( [title] => LIG Item01 [g:id] => 91954 [g:name] => LIG Name01 ) ) )</pre> <p>と思った方・・・・・・・・<br /> 残念ながら違います。<br /> 実際は</p> <pre>SimpleXMLElement Object ( [@attributes] => Array ( [version] => 2.0 ) <pre>[code] => SimpleXMLElement Object ( [title] => LIG [item] => SimpleXMLElement Object ( [title] => LIG Item01 ) ) )</pre> <p>そうなんです、「g:id」と「g:name」ノードがパースされていないんです。<br /> 「simplexml_load_file」でも同様の結果となります。</p> <h2>どうするの?</h2> <p>「XML使えない・・・」と思った方、諦めないでください(笑)<br /> 取得できてないノードを取得する方法はあります!</p> <pre>[code] $xml = simplexml_load_file('xml.xml'); //使用している名前空間を取得します。 $nameSpaces = $xml->getNamespaces(true); $item=$xml->channel->item; //名前空間「g」のノードを取得 $gNode = $item->children($nameSpaces['g']); print($gNode);
結果
SimpleXMLElement Object ( [id] => 91954 [title] => LIG Item02 )無事に取得ができました!
名前空間が指定されたXMLデータを利用する場合には、
ちょっとした一手間が必要だったりします。LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。