仕事、学んでいること、興味のあることなどの「アウトプット」を書き出すブログ。心を高め、魂を磨くために、今日も一生懸命働く。
アマゾンAPIからのXML処理も、
今回で、第3段となりました。
第3弾は、PHPのSAXを利用して、
アマゾンAPIから受け取るXMLデータを処理したいと思います。
⇒SAX版 書籍検索
今回は、XMLの処理が面倒だったので、
「タイトル」と「著者」を画面に表示させています。
SAXというのは、Simple API for Xmlの略のようですね。
XMLパーサ関数とも言うらしいです。
DOMと比べると、大量のデータを、
少ないリソースで扱えるのがメリットです。
デメリットとして、説明書きには、
「ちょっとした操作を行うにもコードが冗長になりやすい、
直感的なコードを記述しにくい」
と書かれていたのですが、
今回、確かに実感いたしました。
また、コールバック関数の使い方など、
少し理解しにくいところがありました。
<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のSAX(Simple API for XML)でAWSを表示</title>
<meta name="description" content="AmazonウェブサービスのXMLデータをPHPのSAXを使って、画面に表示させる。" />
</head>
<body>
<form method="POST" action="<?php $_SERVER['PHP_SELF'] ?>">
SAX版 書籍検索:
<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;
$tags = array();
$cdata = "";
$url2 = array();
$title2 = array();
$author2 = array();
function startElement($parser, $name, $attribs) {
global $tags;
array_push($tags, $name);
}
function endElement($parser,$name) {
global $tags, $cdata, $url2, $title2, $author2;
$tag = array_pop($tags);
if($tag == "DETAILPAGEURL"){
array_push($url2, $cdata);
}
if($tag == "TITLE"){
array_push($title2, $cdata);
}
if($tag == "AUTHOR"){
array_push($author2, $cdata);
}
}
function characterData($parser, $data){
global $tags, $cdata;
$cdata = $data;
}
$xml = xml_parser_create();
xml_set_element_handler($xml, "startElement", "endElement");
xml_set_character_data_handler($xml, "characterData");
$fp = fopen("$urlall", "r");
while($data = fread($fp, 4096)) {
if (!xml_parse($xml, $data, feof($fp))) {
die(sprintf ("error: %s at line %dn",xml_error_string(xml_get_error_code($xml)),xml_get_current_line_number($xml)));
}
}
$i=0;
while(isset($url2[$i])){
print '<p>タイトル:<a href="' . $url2[$i] . '" target="_blank">' . $title2[$i] . '</a><br />著者:' . $author2[$i] . '</p>';
$i += 1;
}
}
?>
</body>
</html>
【今回参考にしたもの】
正直、SAXはあまり使いたくないと思いましたね。
コールバック関数やhandlerの処理は、だいたいのイメージはつかめたのですが、
正確な動作は、正直、理解したとは言いがたい状況です。
ぼくが、勘違いしていたところは、
1回の読み込みで、区切りよくデータを受け取れると、
思ったことです。
でも、冷静になって考えれば、
freadで4096と指定しているので、
区切りが良いわけはありませんね。
とにかく、今回は最後までできたのが、
とても嬉しかったです。
次回のPHPによるXMLデータの取り扱いは、
第4回を迎える予定です。
<< PHPのDOMとXSL関数でアマゾンAPIのXMLを処理
PHPのSimpleXMLでAmazonのXMLをパース >>
[ 起業日記のホームへ ]
仕事の成果や興味を持って体験したこと、また今学んでいることで自分なりにまとめられるようになったことなど、とにかくアウトプットを中心として書いていくブログです。
「1日16時間 起業日記」の意味は、WEBの世界で起業した管理人が、京セラの稲盛和夫さん、HONDAの本田宗一郎さんのように、年間5,000時間以上を数十年と働き続けた名経営者達に憧れて、せめて時間だけでも同じことをしよう!という意気込みを表現しています。
コメント