Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/05/23

counter hits
since 1999/11/06


PHP5を試してみる - SimpleXML関数でRSSしてみる

alertPHPマニュアル XCVIII. SimpleXML関数より。。。このモジュールは、 実験的なものです。これは、これらの関数の動作、関数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリリースで変更される可能性があります。注意を喚起するとともに、このモジュールは使用者のリスクで使用して下さい。

memoサンプルは、EXPERIENCEで実際に確認できるようにしてますので、気になる方は見てみてください。

XML操作を考えた場合、PHP4まではDOMあるいはSAXということになりますが、

  • DOMは面倒
  • SAXは複雑なXMLを扱いにくい

といった問題があります。ここでは、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の構造をツリーで表すと

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
    /**
     * URLからSimpleXMLオブジェクトを取得
     */
    $root = simplexml_load_file("http://www.pat.hi-ho.ne.jp/home.rss");
    foreach ($root->item as $item) {

        /**
         * Namespace付きの子要素を取得
         * この場合、<dc:date>要素が対象
         */
        $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;
?>



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.