- 2007-05-29 (火)
- API × PHP
XMLをパースする、などと言うと専門的で難しく思ってしまうかもしれませんが、何てことはなく、XMLの構造に従って連想配列に格納するだけのことです。
PHP5ではXMLパースは非常に楽になったと聞きますが、私が利用しているロリポップはPHP4しか使えません。しかし、PHP4にもXMLをパースする素晴らしいライブラリーが存在します。
から、「xml.php」というソースコードをダウンロードして、メインプログラムと同じフォルダに置きます。そしてメインプログラムに、
include('xml.php');
$array_data = XML_unserialize($xml_data);
と記述するだけで、XMLを連想配列に格納することが可能です。
それでは上記のプログラムを実行した際に、XMLがどのように連想配列に格納されるかを確認してみましょう。
Amazon Web サービスの商品情報部分(Item)のXML構造に注目してみましょう。
検索結果がひとつの場合
<ItemSearchResponse>
<Items>
<Item>
<ASIN>ASIN番号</ASIN>
<DetailPageURL>詳細ページのURL</DetailPageURL>
</Item>
</Items>
</ItemSearchResponse>
上記のXMLを XML_unserialize 関数で連想配列に格納した結果は、以下のようになります。
Array
(
[ItemSearchResponse] => Array
(
[Items] => Array
(
[Item] => Array
(
[ASIN] => ASIN番号
[DetailPageURL] => 詳細ページのURL
)
)
)
)
連想配列について、ここでは詳しく説明しませんが、上記の連想配列では、例えば商品のASIN番号は、
$array_data[ItemSearchResponse][Items][Item][ASIN]
に格納されています。
それでは次に、商品が2つの場合を考えてみましょう。
検索結果が2つの場合
<ItemSearchResponse>
<Items>
<Item>
<ASIN>ASIN番号-A</ASIN>
<DetailPageURL>詳細ページのURL-A</DetailPageURL>
</Item>
<Item>
<ASIN>ASIN番号-B</ASIN>
<DetailPageURL>詳細ページのURL-B</DetailPageURL>
</Item>
</Items>
</ItemSearchResponse>
上記のXMLを XML_unserialize 関数で連想配列に格納した結果は、以下のようになります。
Array
(
[ItemSearchResponse] => Array
(
[Items] => Array
(
[Item] => Array
(
[0] => Array
(
[ASIN] => ASIN番号-A
[DetailPageURL] => 詳細ページのURL-A
)
[1] => Array
(
[ASIN] => ASIN番号-B
[DetailPageURL] => 詳細ページのURL-B
)
)
)
)
)
上記の連想配列では、例えば商品AのASIN番号は、
$array_data[ItemSearchResponse][Items][Item][0][ASIN]
商品BのASIN番号は、
$array_data[ItemSearchResponse][Items][Item][1][ASIN]
に格納されています。
このことから、検索結果が「1」の場合と「2以上」の場合では、商品個別データの階層が変化してしまうことが分かると思います。
上記した「不具合」を回避する方法はいくらでもありますが、今回は、検索結果が「1」の時に、「2以上」の階層を再現することで回避するプログラムを組んでみたいと思います。考え方としては、検索結果が「1」の時に、
$array_data[ItemSearchResponse][Items][Item][0] = $array_data[ItemSearchResponse][Items][Item];
という処理を行ってやれば、検索結果数に依らず、同じ階層として扱うことができます。
商品情報を連想配列に格納し、出力させるサンプルコード
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Amazon Web サービス 連想配列配列格納サンプル</title>
</head>
<body>
<p>Amazon Web サービス 連想配列格納サンプル</p>
<form action="" method="GET">
<input type="text" maxlength="30" name="Keywords" value="" size="20">
<select name="ResponseGroup">
<option value="Small" selected="selected">最小限の情報</option>
<option value="Medium">中くらいの情報</option>
<option value="Large">たくさんの情報</option>
</select>
<select name="SearchIndex">
<option value="Blended" selected="selected">全ての商品</option>
<option value="Books">和書</option>
<option value="ForeignBooks">洋書</option>
<option value="Electronics">エレクトロニクス</option>
<option value="Kitchen">ホーム&キッチン</option>
<option value="Music">ミュージック</option>
<option value="Classical">クラシック音楽</option>
<option value="DVD">DVD</option>
<option value="Software">ソフトウェア</option>
<option value="VideoGames">ゲーム</option>
<option value="Toys">おもちゃ</option>
<option value="Hobbies">ホビー</option>
<option value="SportingGoods">スポーツ&アウトドア</option>
<option value="HealthPersonalCare">ヘルス & ビューティー</option>
<option value="Watches">時計</option>
</select>
<input type="submit" name="" value="連想配列格納">
</form>
<?php
// ---------------------------------------------------------------
// Amazon Web サービス 連想配列格納サンプル(2007/05/29)
// http://www.naminorito.com/
//
// PHP4で動作確認しています
// 文字コードはUTF-8で保存してください
//
/* ---------------- 変更部分(ここから) -------------------------- */
// 自分のアクセスキーID
$AWSACCESSKEYID = "[Your Access Key ID]";
// 自分のアソシエイトID
$ASSOCIATETAG = "[Your Associate ID]";
/* ---------------- 変更部分(ここまで) -------------------------- */
// APIのURL
$API_BASE_URL = "http://webservices.amazon.co.jp/onca/xml";
//--------- パラメータの値入力
$SERVICE = "AWSECommerceService";
$OPERATION = "ItemSearch";
$API_VERSION = "2004-10-04";
$RESPONSEGROUP = $_REQUEST['ResponseGroup'];
$KEYWORDS = urlencode($_REQUEST['Keywords']); // 検索ワードはURLエンコードする
$SEARCHINDEX = $_REQUEST['SearchIndex'];
$ITEMPAGE = "1";
$CONTENTTYPE = "text/xml";
//--------- リクエストURLの生成と出力
// リクエストURL生成
$api_url = sprintf("%s?Service=%s&AWSAccessKeyId=%s&AssociateTag=%s&Operation=%s&Version=%s&ResponseGroup=%s&Keywords=%s&SearchIndex=%s&ItemPage=%s&ContentType=%s" ,
$API_BASE_URL,
$SERVICE,
$AWSACCESSKEYID,
$ASSOCIATETAG,
$OPERATION,
$API_VERSION,
$RESPONSEGROUP,
$KEYWORDS,
$SEARCHINDEX,
$ITEMPAGE,
$CONTENTTYPE
);
// 連想配列格納ボタンを押された時に、格納した商品情報の連想配列を表示
if(isset($_REQUEST['Keywords'])) {
// 検索ワードが入力されていなければ以下の出力処理を行わない
if(empty($KEYWORDS)) {
}
else {
// XMLデータを取得
$xml_data = file_get_contents($api_url);
// XML パースライブラリーを読み込む
include('xml.php');
// XMLを連想配列に格納する
$array_data = XML_unserialize($xml_data);
// 検索結果が1つの場合は、階層を変化させる
if ($array_data[ItemSearchResponse][Items][Item][0]) {
$item_data = $array_data[ItemSearchResponse][Items][Item];
}
else {
$item_data[0] = $array_data[ItemSearchResponse][Items][Item];
}
// 検索ワードのURLデコード処理
$decode_keywords = urldecode($KEYWORDS);
// 検索ワードのエスケープ処理
$escaped_keywords = htmlspecialchars($decode_keywords, ENT_QUOTES);
// 商品情報の連想配列を出力
echo <<<EOM
<hr />
<p><strong>$escaped_keywords</strong>の商品検索結果を格納した連想配列は以下の通りです</p>
EOM;
echo "<pre>";
print_r($item_data);
echo "</pre>";
}
}
?>
<hr />
<p>サンプルコードの解説は <a href="http://www.naminorito.com/blog/2007/05/29080000.php">Amazon Web サービスの使い方(5) - XMLを連想配列に格納する</a> を参考にして下さい</p>
<p>Copyright © <a href="http://www.naminorito.com/blog/">ホリデーウェブマスターブログ</a></p>
</body>
</html>
動作サンプルは以下になります。
Amazon Web サービス 連想配列格納サンプルプログラム
今回のプログラムは、取得したXMLデータを連想配列 $array_data に格納し、検索結果数に応じて $item_data に商品情報(Item タグ内)を格納し直して表示させています。
もはや、ほとんどプログラムは完成していますが、次回は、検索結果表示の整形の辺りを説明したいと思います。
しかし、プログラミング素人の自分が、ソースコードを開示するという行為は、この上なく恥ずかしいことですね(^^;
echo とか print とかが全然使い分けられていない結果出力のあたりが、勉強不足でかなり恥ずかしい感じです。
間違いがあれば、是非指摘して下さい。
Tags :Php?Xml?配列?Xml_unserialize??
カテゴリ「API × PHP」の最新記事
-
2007-07-09 08:00 - Amazon Web サービスの使い方(7) - Amazon Review Search を公開します
-
2007-05-30 06:00 - Amazon Web サービスの使い方(6) - 検索結果を表示させる
-
2007-05-29 08:00 - Amazon Web サービスの使い方(5) - XMLを連想配列に格納する
-
2007-05-25 12:00 - Amazon Web サービスの使い方(4) - 取得したXMLの構造
-
2007-05-21 17:20 - Amazon Web サービスの使い方(3) - リクエストURL生成
「php」に関連する商品を...
- Newer: Amazon Web サービスの使い方(6) - 検索結果を表示させる
- Older: キーワードアドバイスツール正式サポート終了