AmazonウェブサービスのXMLデータを処理し続けて、
今回で第5段目をむかえることができました。

今日のテーマは、XMLReaderです。

実際、端から見たら、かなり無駄なんでしょうけど、
ぼくのようなプログラミング初心者は、
一丁前のセキュアなウェブサービスなんて、
まだ作れっこないので、
こうやって、課題を無理やり作って、
経験と知恵、ノウハウを積み上げていくのです!

今回の完成品は、以下のリンクからお確かめください。
XMLReader版 書籍検索

あいかわらず、
タイトルと著者だけを表示させる、大変シンプルなものとなっております。^^

XMLReaderとは?

前回のSimpleXMLは、XML文書全体を、
まず読み込みますので、大きなデータの場合だと、
パフォーマンスに影響が出てくるようです。

ところが、XMLReaderは、
1件ずつ順番に読み込んでいくので、
文書量が大きい場合に、効果を発揮します。

XMLReaderを使ったPHPのコード



<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>PHPのXMLReaderを使ってAmazonウェブサービス</title>
<meta name="description" content="アマゾンウェブサービスからXMLデータを受け取り、PHPのXMLReaderを使って、変換しています。" />
</head>
<body>

<form method="POST" action="<?php $_SERVER['PHP_SELF'] ?>">
XMLReader版 書籍検索:
<input type="text" name="keywd" size="30" maxlength="255" value="<?php print($_POST['keywd']); ?>" />
<input type="submit" value="検索" />
</form>

<?php
// 検索ボックスに入力されたかの判定
if($_POST['keywd'] != '') {

    $url = "http://ecs.amazonaws.jp/onca/xml";
    $Service = "?Service=AWSECommerceService";
    $AWSAccessKeyId = "&AWSAccessKeyId=*****************";
    $Version = "&Version=2008-04-07";
    $AssociateTag = "&AssociateTag=working16h-22";
    $ContentType = "&ContentType=" . urlencode("text/xml");
    $Operation = "&Operation=ItemSearch";
    $SearchIndex = "&SearchIndex=Books";
    $ResponseGroup = "&ResponseGroup=Medium";
    $Keywords = "&Keywords=" . urlencode(htmlspecialchars($_POST['keywd']));

    $urlall = $url.$Service.$AWSAccessKeyId.$Version.$AssociateTag.$ContentType.$Operation.$SearchIndex.$ResponseGroup.$Keywords;

$xReader=new XmlReader();
$xReader->open($urlall);
while($xReader->read()) {
    switch($xReader->nodeType) {
        case XmlReader::ELEMENT :
            switch($xReader->name) {
                case 'Items' :
                    // 飾りの処理
                    print("10件表示");
                break;
                default :
                    // $tmpDataの連想配列のキー
                    $tmpName=$xReader->name;
}
            break;

        case XmlReader::TEXT :
            // 前タグと後ろタグの間の中身。とりあえず全てを代入
            $tmpData[$tmpName]=$xReader->value;
            break;

        case XmlReader::END_ELEMENT :
            switch($xReader->name){
                case 'Item' :
                    // Itemsの中の10個のItem。Itemが閉じた時に出力。10件表示なので10回繰り返される。
print '<p>タイトル:<a href="' . $tmpData['DetailPageURL'] . '" target="_blank">' . $tmpData['Title'] . '</a><br />著者:' . $tmpData['Author'] . '</p>';

                    break;
                default :
                    $tmpName='';
            }
            break;

    }
}

// ifの閉じ
}
?>

</body>
</html>

PHPのXMLReaderのまとめ

独習PHP【今回参考にしたもの】

XMLReaderは、
いろいろなことができるようですが、
今回は、本当にその一部分を使わせてもらいました。

少し構造を理解したら、
すぐに使えてしまうと思いますので、
使用感としては、まずまずの手ごたえでした。

それにしても、
今回も、独習PHPさんのお世話になってます。

PHPの学習のために、
最初は赤マンモス本を購入したのですが、
あっちはやや難易度が高く、
ピカピカの初心者には、あまり向いていないかもしれません。

次回は、SOAPかPEARに突入します!

【関連している記事】