EC studio EC studio 技術ブログ

2007年08月07日投稿者:須藤 裕嗣

PHP4でのXMLデータの取り扱い

はじめまして!
EC studioで技術担当をしている須藤裕嗣です。

今日はPHP4におけるXMLデータの取り扱いについて紹介します。

PHP5においてはXMLのサポートも強化されており、
SimpleXML拡張モジュールなどの便利な関数を
最初から利用することもできます。

「PHP5の関数をPHP4で使う - PHP_Compat」でもお伝えした通り
PHP4は2007年末でサポートを終了となります。
しかし、まだまだPHP4で動いているシステムも多いのが
現状ではないでしょうか。

PHP4において、どのようにXMLを処理することができるのか
いくつかご紹介いたします。

xml_parse()関数

(PHP4の組み込み関数)

サンプルとして以下のXMLデータを解析し、
表示させるスクリプトをご覧ください。

XMLデータ(test.xml):
<?xml version="1.0" encoding="UTF-8" ?>
<user>
   <name>須藤裕嗣</name>
   <language>php</language>
   <language>javascript</language>
</user>

  1. $xml_data = file_get_contents("test.xml");
  2. $depth = 0;
  3. //要素開始タグ
  4. function start_element_handler($parser, $name, $attrs){
  5.     global $depth;
  6.     echo("<br>\n");
  7.     if ($depth) {
  8.         echo str_repeat('-',$depth);
  9.     }
  10.     echo $name;
  11.     $depth++;
  12. }
  13. //要素終了タグ
  14. function end_element_handler($parser, $name){
  15.     global $depth;
  16.     $depth--;
  17. }
  18. //値を表示
  19. function data_handler($parser,$data){
  20.     if (trim($data)){
  21.         echo(":".$data);
  22.     }
  23. }
  24. $xml_parser = xml_parser_create();
  25. xml_set_element_handler($xml_parser, "start_element_handler", "end_element_handler");
  26. xml_set_character_data_handler($xml_parser,"data_handler");
  27. if (!xml_parse($xml_parser, $xml_data)) {
  28.     die(sprintf("XML error: %s at line %d",
  29.                 xml_error_string(xml_get_error_code($xml_parser)),
  30.                 xml_get_current_line_number($xml_parser)));
  31. }
  32. xml_parser_free($xml_parser);

XMLパーサ(xml_parse)は各要素・属性・値を
どのように処理するのかを、それぞれ関数を作成し
指定する必要があります。

上記サンプルは解析して表示するだけの、
非常にシンプルな処理なのですが、
とても見づらくなってしまいますね。

Keith Devens - PHP XML Library

(こちらからダウンロードし、xml.phpというファイル名で保存)
このライブラリを利用すると、比較的軽く結果を得ることができ
とても便利です。

xml_parse()関数と同じXMLデータを配列に格納する処理を
ご覧ください。

  1. include('xml.php');
  2. $data = XML_unserialize($xml_data);

これだけで$dataに配列としてXMLデータが入ってきます。
XML_unserializeの結果

XML_Unserializer

(PEARのXML_Serializerをインストール)
PEARにもXMLを解析する便利なクラスが用意されています。

同様に同じXMLデータを配列に格納する処理をご覧ください。

  1. require_once "XML/Unserializer.php";
  2. $parser = new XML_Unserializer(array('parseAttributes' => true));
  3. $parser->unserialize($xml_data);
  4. $data = $parser->getUnserializedData();

この場合以下のような配列が$dataに格納されます。
XML_Unserializerの結果配列

ここで少し変わったXMLデータを試してみます。
XMLデータ:
<?xml version="1.0" encoding="UTF-8" ?>
<user>
   test
   <name>須藤裕嗣</name>
   <skill>php</skill>
   <skill>javascript</skill>
</user>

実は先ほど紹介した「Keith Devens - PHP XML Library」では
このデータをうまく解析できません。
「XML_Unserializer」を使うと以下のように処理することができます。
XML_Unserializerの結果配列(test付き)
'_content'というキーはオプションで変更することも可能です。

このようなXMLデータを扱う機会は少ないとは思いますが、、
少し複雑なXMLを扱うときには、XML_Unserializerをお勧めします。
解析する際のオプションも充実しておりますので、ご参照ください。
PEARマニュアル


関連した記事:
投稿者
人気のエントリー
カテゴリー
最近のエントリー
アーカイブ
Copyright© ChatWork, All Rights Reserved. secured by ESET.