XML_Unserializer

xml.phpで困った事

 

先日書いた日記の通り、xml.phpXMLを配列に変換して使ってたのだけど、XML 内の同階層同名タグの件数によって、生成される配列の階層が変わってしまうという事に気づいた。気づくの遅すぎ。

たとえば、ATOM の Feed とか。

エントリは一件ずつ entry というタグで表現される。

この中に、例えば件名なら title というタグで表現される。

フィード内にエントリが一件だけだと

$data['feed']['entry']['title'];

でも、二件以上ある場合、すなわち entry タグが複数存在する場合、話が違ってくる。

$data['feed']['entry'][0]['title'];
$data['feed']['entry'][1]['title'];

というふうに、 entry の中身をさらに配列で持つというカタチになる。配列の階層が一段深くなるのだ。

if 文で件数によって呼び出し先を変えたりするのは、どうにも美しくない。

 

XML_Unserializer で解決

 

そこで PEARXML_Unserializer です。

配列に変換するときに、特定のタグに対して一件だろうが複数件だろうが必ず配列にしなさいオプションがあるのだ。

今回の例だと、 entry タグは、何件有ろうが必ず配列にしてちょうだい、と設定する。

$us->setOption('forceEnum', array('entry') );

これで常に entry タグの件数にかかわらず

$data['entry'][0]['title'];

という形式でアクセスできる。なるほど便利。

PHP5 なら SimpleXML で直接ノードをたどれるので良いんだけどね。PHP4 だからこんな力技。しかたないよね。