Web事業部実績紹介
Web事業部実績紹介
2013.02.04

一手間必要。PHPでのSimpleXML関数のパース処理

tetsu

一手間必要な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データを利用する場合には、
ちょっとした一手間が必要だったりします。