様々なWEBサービスで提供されているAPIを利用するときやRSSをいじりたいときなど、最近は少なからずXMLのデータ形式を扱うことがあります。PHPでこれらを操作するとき皆さんならどのようにしますか。今回はPHPで簡単にXMLをパースすることが出来るPEAR::XML_Serializerを紹介します。
インストールは
pear install --alldeps xml_serializer-beta
PEAR::XML_Serializerはまだベータ版であり且つ依存しているパッケージ、PEAR::XML_UtilやPEAR::XML_Parserがあるので--alldepsオプションを付けてインストールするとこれらが依存しているパッケージも一緒にインストールしてくれるので便利です。
では早速使ってみましょう。以下のスクリプトを実行してみてください。
<?php
require_once("XML/Serializer.php");
$data = array(
'channel' => array(
'title' => 'サンプルRSS',
'link' => 'http://localhost/',
'description' => 'XML_Serializerのサンプル',
'language' => 'ja-jp',
'pubDate' => date("r"),
array(
'title' => 'タイトル1',
'link' => 'http://localhost/1/',
'pubDate' => date("r"),
'description' => 'サンプル1'
),
array(
'title' => 'タイトル2',
'link' => 'http://localhost/2/',
'pubDate' => date("r"),
'description' => 'サンプル2'
)
)
);
$options = array(
XML_SERIALIZER_OPTION_INDENT => "\t",
XML_SERIALIZER_OPTION_XML_ENCODING => 'UTF-8',
XML_SERIALIZER_OPTION_XML_DECL_ENABLED => TRUE,
XML_SERIALIZER_OPTION_ROOT_NAME => 'rss',
XML_SERIALIZER_OPTION_ROOT_ATTRIBS => array('version' => '2.0'),
XML_SERIALIZER_OPTION_DEFAULT_TAG => 'item'
);
$serializer = new XML_Serializer($options);
$serializer->serialize($data);
$result = $serializer->getSerializedData();
header("Content-Type: text/xml; charset=utf-8");
echo $result;
?>
サンプルのRSSが出力されます。スクリプトの内容を解説すると、XMLとして出力するデータを連想配列で作成し、serializeメソッドで変換、getSerializedData()メソッドで変換したデータを取得しています。これだけで連想配列がXMLに変換されます。
またXMLを連想配列に変換するXML_Unserializerクラスもあります。
<?php
require_once("XML/Unserializer.php");
$xml = <<< DOC_END
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>サンプルRSS</title>
<link>http://localhost/</link>
<description>XML_Serializerのサンプル</description>
<language>ja-jp</language>
<pubDate>Wed, 14 Feb 2007 13:33:58 +0900</pubDate>
<item>
<title>タイトル1</title>
<link>http://localhost/1/</link>
<pubDate>Wed, 14 Feb 2007 13:33:58 +0900</pubDate>
<description>サンプル1</description>
</item>
<item>
<title>タイトル2</title>
<link>http://localhost/2/</link>
<pubDate>Wed, 14 Feb 2007 13:33:58 +0900</pubDate>
<description>サンプル2</description>
</item>
</channel>
</rss>
DOC_END;
$options = array(
XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE => 'parseAttributes'
);
$unserializer = new XML_Unserializer($options);
$unserializer->unserialize($xml);
$result = $unserializer->getUnserializedData();
var_dump($result);
?>
XML_Serializerと似たようなものですが、unserializeメソッドでXMLを連想配列に変換し、getUnserializedDataメソッドでその変換されたデータを取得します。
このようにPEAR::XML_Serializerを使うと連想配列をXMLにしたり、その逆、XMLを連想配列にしたり出来るようになり、面倒なXMLのパース作業がとても簡単になります。興味のある方は是非使ってみてはいかがでしょうか?
PEAR::XML_Serializer : http://pear.php.net/package/XML_Serializer/