様々な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/