PHP5を試してみる - SimpleXML関数でRSSしてみる
PHPマニュアル XCVIII. SimpleXML関数より。。。このモジュールは、 実験的なものです。これは、これらの関数の動作、関数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリリースで変更される可能性があります。注意を喚起するとともに、このモジュールは使用者のリスクで使用して下さい。
サンプルは、EXPERIENCEで実際に確認できるようにしてますので、気になる方は見てみてください。
XML操作を考えた場合、PHP4まではDOMあるいはSAXということになりますが、
といった問題があります。ここでは、PHP5から追加された簡単にXMLファイルを扱うための「SimpleXML関数」について試してみました。
以前に、Relaxerを参考にXMLアクセスクラスを自動生成してみましたが、SimpleXML関数も基本的には同じようなイメージで、
- 要素・属性をオブジェクトとして扱うことができる
- Xpathが利用可能
- 名前空間(Namespace)対応
- DOMオブジェクトとの連携が可能
といった特長があります。
SimpleXML関数を使った簡単な例は以下のようになります。「PHP4.1.x以降のXSLTサポート手順」にあるtest.xmlを読み込み、同様な出力をさせるものです。
●simplexml.php5
<?php
function convert($str) {
return mb_convert_encoding($str, mb_internal_encoding(), "auto");
}
?>
<?php
$article = simplexml_load_file('test.xml');
echo convert($article->subject);
echo "<hr>";
echo "<ul>";
foreach ($article->book as $book) {
echo "<li>";
echo "<b>" . convert($book->title) . "</b>";
echo "(" . convert($book->isbn) . ")";
echo "</li>";
}
echo "</ul>";
?>
PHPスクリプトはたったこれだけです。ホントに楽チンです(^-^) SimpleXML関数の利用手順としては、以下のような感じになります。
- simplexml_load_file関数、あるいは、simplexml_load_string関数でXMLファイル/データを読み込む。戻り値はルート要素のオブジェクトとなる
- 各ノードがオブジェクト扱いなので、ディレクトリを下るイメージでアクセスする
- 注意点として、マルチバイト文字を扱う場合、internal_encodingに変換して出力する必要がある
後者が分かりにくいかも知れませんが、test.xmlの構造をツリーで表すと
となり、book要素が複数存在している状態で(「root」要素は実在はしません)、各要素はオブジェクトとして扱うことができます。で、それぞれの子要素(「article要素に対するbook要素」など)は、通常のディレクトリと同じ要領でアクセスできます。もう一つ、ディレクトリを表す「\」や「/」ではなく、「->」を使ってアクセスします。これを踏まえて、article要素から各要素へ辿る場合、
- subject要素:$article->subject
- book要素:$article->book
- title要素:$article->book->title
となります。book要素は複数あるので、配列として扱うことができます。3番目のbook要素へは、
$article->book[2]
としてアクセスすることができます。今回のサンプルでは、foreach関数を使って、全てのbook要素を順番に取得しています。
また、属性へのアクセスは、連想配列を扱う要領と同じで、キーとして属性名を指定します。例えば、
●test2.xml<?xml version="1.0" encoding="shift_jis"?>
<article>
<subject>PHP関連書籍</subject>
<book isbn="ISBN4-7973-1392-7">
<title>PHP4徹底攻略</title>
</book>
:
のようなXMLの場合、対応するPHPスクリプトは以下のようになります。
●simplexml2.php5
<?php
:
foreach ($article->book as $book) {
echo "<li>";
echo "<b>" . convert($book->title) . "</b>";
echo "(" . convert($book['isbn']) . ")";
echo "</li>";
}
:
?>
で、これらのサンプルを元にPEARのXML_RSSでRSSしてみるでやったようなRSSリーダを作ってみましたが、やはりかなり単純なスクリプトになります。ここでは、異なる名前空間であるdate要素も取り出してみました。思いっきり名前空間URIを指定することになりますが、DOMを使った場合、ここまで簡単にはならないですよねぇ。。。
●simplexml_rss.php5
<?php
function show($str) {
echo mb_convert_encoding($str, mb_internal_encoding(), "auto") . "\n";
}
?>
<?php
$root = simplexml_load_file("http://www.pat.hi-ho.ne.jp/home.rss");
foreach ($root->item as $item) {
$dc = $item->children('http://purl.org/dc/elements/1.1/');
show(
sprintf(
'<li><a href="%s" title="%s">%s</a> (%s)</li>',
$item->link,
$item->title,
$item->title,
$dc->date) .
"<dt>" .
sprintf('<dd>%s</dd>' ,$item->description) .
"</dt>");
}
$root = null;
?>
|