« PHPのShift_JIS文字化け対策1 | トップページ | レンタルサーバーでPEARを使う方法 »

2005年11月21日

XML Libraryを使ってみよう

XMLをPHP上で簡単に操作する方法を「PHP XML Library」を使って紹介します。
PHPとXMLを連携する際に、PHPの標準関数を使用したりPEARを使ったり色々な方法がありますが、今回紹介するのはXMLを多次元配列にセットしたり、またはその逆(配列をXMLに変換すること)が出来ます。

Keith Devens .com

まず、Keith Devens .comから「PHP XML Library, version 1.2b」をダウンロードします。
次にダウンロードしたプログラムをrequire_once関数やinclude_once関数で読み込ませます。

require_once('xml.php');

これで準備はOKです。
次に読み込ませるXMLを準備しましょう。
今回は、簡単な例として以下のようにシンプルなXMLを準備しました。
<?xml version="1.0" encoding="utf-8"?>
<DOCUMENT>
  <members id="1">
    <name>テスト 太郎</name>
    <age>30</age>
  </members>
  <members id="2">
    <name>テスト 花子</name>
    <age>25</age>
  </members>
</DOCUMENT>

このXMLを「test.xml」を言う名前で保存しておきます。
fread関数を用いて、xmlを変数に全て格納します。
$fp = fopen("test.xml", "r");
$xml = fread($fp, filesize("test.xml"));
fclose($fp);

require_onceで読み込ませたファイルの中に定義されているXML_unserialize関数を使用して変数に格納します。
$data = XML_unserialize($xml);

$data配列の中にXMLの内容が格納されています。
var_dump関数などを使用して表示してみましょう。
今までのソースをまとめると以下の通りです。
require_once('xml.php');

$fp = fopen("test.xml", "r");
$xml = fread($fp, filesize("test.xml"));
fclose($fp);

$data = XML_unserialize($xml);
var_dump($data);


XMLを配列に変換するサンプルはこちらから。(ソースを表示すると見やすいと思います)

今度は、変数に格納したXMLを復元してみましょう。
先程、生成した変数をXMLに変換するにはXML_serialize関数を使用します。

echo XML_serialize($data);

XMLとして出力されます。
出力したサンプルはこちらから。

今まで紹介したように、XMLを簡単に使用したい場合など重宝します^^;
ただ、今までの経験上からですが配列にセットした場合、予想した値が格納されなかったりバグの原因になりやすく、また発見しにくいので複雑な処理には向いてないと思います。
それでも結構便利ですが、、、^^;

・関連記事
XML_Serializerを使ってみようを見る
XML LibraryのPEAR版みたいなものです。

トラックバック

このエントリーのトラックバックURL:
http://www.s-memo.net/mt/mt-tb.cgi/2

コメント

初めまして。
Keith Devens .comのPHP XML Libraryを使って、XMLのパースを行おうとしています。
一つお聞きしたいのですが、上記のライブラリを使用時に警告のたぐいは出現しませんでしたでしょうか。

Warning: Call-time pass-by-reference has been deprecated - argument passed by value; .....

の警告がxml.php on line 63,64,65,66,68,73で発生してしまいます。

PHPについて勉強不足のところがあるのですが、リファレンスの渡し方をどのように変更していいか悩んでいます。是非、ご教授頂けたらと思います。

もしくは、エラー表示を切っていれば問題ないものなのでしょうか。

ちなみに、ダンプ、配列の指定表示は問題なく行えます。

よろしくお願いします。

初めまして。
wavyさんコメントありがとうございます!

> の警告がxml.php on line 63,64,65,66,68,73で発生してしまいます。
php.iniのallow_call_time_pass_referenceをOnにして、xml.phpの警告を消して対応しています。
ただ、PHP本家ではallow_call_time_passはOffで正常に動くように推奨しています。
allow_call_time_passの詳細はこちらをご覧下さい

もしかしたらxml.phpを改造すればOffでも警告を消せるかもしれないのですが、ライブラリの改造は出来れば避けたいので、上記のやり方で対応しています。
推奨されていない上に将来無くなる可能性はありますが、無くなる理由が「ソースが汚くなるのを防ぐ為」となっていたので、セキュリティ等の問題はないのであれば警告を消す方向にしました。無くならないことを祈りつつ、、、

htaccessで対応しました。
ありがとうございます。

客先のサーバー環境がいまいち不明な上、PHPのバージョンも4.1ぐらいなのでちょっと不安です。。。
(simpleXMLが使えればいいのですが)

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)