Viper 2で学ぶXMLデータベース最新事情
Viper 2で学ぶXMLデータベース最新事情(2)

マッシュアップしたいけどPHPでDOMはイヤ!


日本アイ・ビー・エム
中林 紀彦
2007/11/22

課題2:DOMを使ったXMLデータの検索

 次にお天気の情報ですが、今回はLivedoorが提供するお天気Webサービス(Livedoor Weather Web Service:LWWS)を利用して取得することにしました。

 さて、ここで次の課題です。ユーザー管理テーブルに持っている“地域名”の属性からは直接お天気Webサービスを呼び出すことができず、地域名に対応する1次細区分IDをWebサービスのパラメータとして渡す必要があります。地域名から1次細区分IDを取得するためには、「全国の地点定義表(RSS)」というXMLの対応表を利用する必要があるのですが、この部分を実装するのがこれまた一苦労です。URLからXMLを取得する部分はすぐに実装できたのですが(リスト3-1、リスト3-2)、“地域名”で検索し“id”を取得する部分がよく分かりません。

$url = 'http://weather.livedoor.com/forecast/rss/forecastmap.xml';
$xmlstr = file_get_contents($url);
$docm = new DOMDocument();
$docm->loadXML($xmlstr);
リスト3-1 1次細分区定義表XMLデータのリアルタイム取得

$url = 'http://weather.livedoor.com/forecast/rss/forecastmap.xml';
$sxe = new SimpleXMLElement($url, NULL, TRUE);
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$domnode = dom_import_simplexml($sxe);
$domnode = $dom->importNode($domnode, true);
$domnode = $dom->appendChild($domnode);
$xmldoc = $dom->saveXML($domnode);
リスト3-2 1次細分区定義表XMLデータのリアルタイム取得(SimpleXMLを利用)

 PHPのマニュアルを見ると“DOMXPath->query()”を使うとXPathで検索できそうだと分かったのですが、いざ具体的に実装するとなると、いつもは親切なマニュアルの例(サンプル・コード)を見てもさっぱり分かりません……。約1日の試行錯誤の末、何とか使い方を理解でき、いくつかのケースではうまくいったのですが、肝心のidの取得の方はさっぱりうまくいきません(リスト4)。

 さて、リスト4は何が間違っているのでしょうか? 答えは最後に紹介します。

$xpath = new DOMXPath($dom);
$query =
  '/rss/channel/ldWeather:source/area/pref/city[@title = "仙台"]';
$results = $xpath->query($query, $dom);
foreach ($results as $result) {
  echo $result->getAttribute('id');
}
リスト4 idの取得に失敗する……

 時間もなくDOMを使った実装をあきらめたKさんは、MySQLで対応テーブルを準備しました(図3)。その結果リスト5のように地域のidを用意したテーブルから取得することができるようになりました(このことが後で不測の事態を招くとは露知らず)。

図3 MySQLで急きょ作成した地域名とidの対応テーブル
画像をクリックすると拡大します

  <記事 記事ID="10">
    <タイトル>テーブルの頻繁な設計変更を楽にしたい</タイトル>
    <投稿者>
      <ユーザ名 ユーザID="10">Kさん</ユーザ名>
      <地域 id="70">横浜</地域>
    </投稿者>
  </記事>
リスト5 最終的に生成されるXMLの完成形
ここでは地域idしか取得できていませんが、このidを使ったWebサービスの取得があるものとします。今回はこの部分は省略します。


課題3:XMLデータの並べ替え(ソート)や集計

 DOMは本来、文書(Document)を扱うためのAPIなので、ドキュメント内のデータのソート(並べ替え)や集計を行う関数がありません。今回の要件では、XMLデータのソートや集計といった要件はありませんでしたが、XMLデータを扱ううえでは、この機能をどう実装するかという課題は避けて通れそうにありません。

 いろいろと苦労したKさんでしたが、何とか締め切り前日にギリギリ間に合いました。ようやく一安心と思っていたところ、翌日「全国の地点定義表(RSS)」のIDが変更されていたために、新機能サービス開始早々、トラブルに見舞われてしまいました。

 結局、「全国の地点定義表(RSS)」のXMLを定期的に取得し、MySQLに格納するプログラムを用意することになってしまいました……。

  2/3

 Index
連載:Viper 2で学ぶXMLデータベース最新事情(2)
 マッシュアップしたいけどPHPでDOMはイヤ!
  Page 1
・“マッシュアップ”の追加にKさんの苦悩は続く
・課題1:データベース(MySQL)から取り出した結果セットのXML化
Page 2
・課題2:DOMを使ったXMLデータの検索
・課題3:XMLデータの並べ替え(ソート)や集計
  Page 3
・やっぱりXMLにはXMLデータベースとXQueryが素直でいいね
・時間が余ったので、追加のマッシュアップ


Viper 2で学ぶXMLデータベース最新事情



Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間