第3回 PHPを利用してXMLを処理する方法 - マッシュアップ講座

ZAPA先生のマッシュアップ講座

Lecutures on PHP

第3回 PHPを利用してXMLを処理する方法 (その1)

 このエントリーをはてなブックマークに追加

ライブドアの天気予報を表示する

ZAPA先生前回までで、URLを指定するだけで利用できるAPIとPEARライブラリを利用してRSSフィードを処理する方法を解説しました。今回は、WebサービスAPIのレスポンスとして一般的であるXMLを処理する方法を解説します。

PHPでXMLを処理する方法にはいくつかの種類が存在します。PHPの最新バージョンであるPHP5にはSimpleXML関数という、XMLをオブジェクトに簡単かつ容易に変換するための機能が提供されています。一方、PHP5への移行が進まず、PHP4を利用し続けている環境も多いのが現状です。

そこで、今回はPHP5を利用してXMLを処理する場合と、PHP4を利用してXMLを処理する場合について、それぞれの処理方法を解説します。

利用するAPIとしては、日本のWebサービスであり、ドキュメントも日本語で用意されているライブドアのお天気Webサービス(Livedoor Weather Web Service / LWWS)を利用します(*1)。天気予報という身近な情報をXMLで取得して、解析・表示する方法を理解することで、XMLの処理方法を学びましょう。

お天気Webサービスの利用方法について

お天気Webサービスは、REST形式のAPIで、ベースとなるURLにパラメータを渡してリクエストします。ベースURLは以下の通りです。

http://weather.livedoor.com/forecast/webservice/rest/v1

このURLに、以下の2つのパラメータを加えてリクエストします。

city(地域別に定義されたID番号)
day(リクエストする予報日)

リクエストする地域とIDの対応は全国の地点定義表(*2)に詳しく載っています。リクエストする予報日は、today、tomorrow、dayaftertomorrowの3つから選択可能です。リクエストパラメータは以上の2つだけしかないため、理解しやすいと思います。

では、実際に「東京の明日の天気」をリクエストしてみましょう。ベースURLに東京のID番号63と予報日tomorrowを指定して、以下のようにURLを生成します。

http://weather.livedoor.com/forecast/webservice/rest/v1?city=63&day=tomorrow

ZAPA先生WebブラウザからこのURLにアクセスしてみると、XMLが表示されるのがわかります。HTTPでのリクエストに対してXMLがレスポンスとして返ってきたことになります。この仕組みがWebサービスAPIとして一般的に利用されている、REST形式でXMLが返ってくるAPIになります。なお、取得したXMLには天気予報の情報が詳しく表示され、パラメータを変えることで、自由に情報を得ることができるようになっています。地域IDと予報日を変化させるとどのように表示が変わるのか、いろいろ試してみて下さい。

お天気Webサービスの基本的な仕組みを理解したところで、PHP5とPHP4でのXML処理方法についての解説に移ります。

PHP5でSimpleXML関数を使ってXMLを処理する方法

PHP5にはSimpleXML関数という、XML処理のための便利な関数が組み込まれています。ここでは、SimpleXMLを使ったXML処理方法を解説します。使い方はとても簡単で、以下のようにsimplexml_load_file関数を使ってXMLドキュメントをパースすることで、オブジェクトを取得することができます。simplexml_load_file関数に与えるXML ファイルへのパスには、外部ドメインを指定することができます。

$xml =  simplexml_load_file('XML ファイルへのパス');

$xmlには、SimpleXMLElement クラスのオブジェクトが代入されます。したがって、以下のようにvar_dump関数を使うことで、パースした結果がオブジェクトにどのように代入されているかを確認することができます。

var_dump($xml);

以下のリスト1は、「東京の明日の天気」を表示するサンプルプログラムになります。

● リスト1 lwws.php
   1 <html>
 
  2 <head>
 
  3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 
  4 <title>ライブドアの天気予報を表示する</title>
 
  5 </head>
 
  6 <body>
 
  7 <?php
   8
//ライブドアの天気予報を表示する関数
 
  9 function lwws($city,$day){
 
10
  11   
//XMLデータ取得用ベースURL
 
12   $req = "http://weather.livedoor.com/forecast/webservice/rest/v1";
 
13   
  14   
//XMLデータ取得用リクエストURL生成
 
15   $req .= "?city=".$city."&day=".$day;
 
16   
  17   
//XMLファイルをパースし、オブジェクトを取得
 
18   $xml = simplexml_load_file($req)
 
19    or die("XMLパースエラー");
 
20   
  21   
//$xmlオブジェクトの中身を確認する場合は、以下のコメントを外す
 
22   /*
  23   echo "<pre>";
  24    var_dump ($xml);
  25   echo "</pre>";
  26   */
 
27   $ret = '<div class="lwws">';
 
28   $ret .= "<div>".$xml->title."</div>";
 
29   $ret .= "<div><img src=\"".$xml->image->url."\" alt=\"".$xml->image->title."\"></div>";
 
30   $ret .= "<div>".$xml->description."</div>";
 
31   $ret .= "<div>最高気温".$xml->temperature->max->celsius."度</div>";
 
32   $ret .= "<div>最低気温".$xml->temperature->min->celsius."度</div>";
 
33   $ret .= "</div>";
 
34   return $ret;
 
35
  36
}
 
37
  38
echo "<h1>ライブドアの天気予報を表示する</h1>\n";
 
39
  40
//リクエストパラメータ設定
 
41 $city = "63"; //東京を設定
 
42 $day = "tomorrow"; //tomorrow(明日の天気)を設定
 
43
  44
//ライブドアの天気予報を表示する関数をコールする
 
45 echo lwws($city,$day);
 
46
  47
?>
  48 </body>
  49 </html>
■ lwws.phpを実行したときの表示画面

lwws.phpを実行したときの表示画面

後から再利用しやすいように、地域と予報日のパラメータを与えるとHTMLタグを生成して返す関数lwws()を作っています。使い方は以下のようになります。

echo lwws($city,$day);

ZAPA先生地域IDと予報日を指定するだけの関数にして、他のPHPプログラムからも扱いやすいように設計しています。関数化することによって、例えば、会員の住所に応じて自動的に天気予報を表示するようなWeb アプリケーションとしても組み込みやすくなります。関数内のHTMLタグについては、扱いやすいように自由に変更して構いません。

このlwws関数内の処理では、まずsimplexml_load_file関数にリクエスト用URLを指定して、$xmlオブジェクトを得ています。このオブジェクトの中身を確認したい場合は、var_dump()を使って表示させることができます。

そして、取得した$xmlオブジェクトの各種プロパティであるtitle、image->url、image->title 、description、max->celsius、min->celsiusを表示させています。これらのプロパティは、取得したXMLファイルのタイトル、天気アイコンのURL、天気、天気概況文、最高気温、最低気温を表しています。XMLの解析というと、とても難しそうなイメージを持ってしまいがちですが、SimpleXML関数を使うと、このように簡単に処理することができます。

----
*1):お天気Webサービスは、現在全国142カ所の今日・明日・あさっての天気予報・予想気温と都道府県の天気概況情報を提供しています。
詳しくは下記URLをご覧下さい。
http://weather.livedoor.com/weather_hacks/webservice.html

*2):http://weather.livedoor.com/forecast/rss/forecastmap.xml

  • 1
  • 2

  



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)