TabView Control: Getting Content from an External Source(その2)

2009/6/5 tetsuya.odaka phpのバグを修正(なんで間違ったかな。動くはずないのに)

=============================================

先の例では、ProxyとなるPHPから「YAHOO! News SearchのWebService」を呼ぶ際に、output=phpを指定して、serialize化されたphpファイルを取得した。

とはいえ、汎用的なマッシュアップを考えた場合、xmlが処理できるに越したことはない。
幸い、PHP5にはSimpleXMLという処理系があるので、これを使って、同じサンプルを実装してみる。

まず、以下のphpプログラムでYAHOO News SearchのXMLをSimpleXMLオブジェクトとして読み込んだ結果をダンプしてみる。

<?php
error_reporting(E_ALL);

$queryString='query=Opera+Browser';

// xmlで取得
$url = 'http://search.yahooapis.com/NewsSearchService/V1/newsSearch?appid=YahooDemo&'.$queryString; 

$xml = simplexml_load_string(file_get_contents($url));
var_dump($xml);

?>

この結果の画面が以下である。

これをみると、simplexml_load_string()で取り込んだWebServiceのレスポンスは、SimpleXMLオブジェクトの入れ子になり、そのプロパティーに「XMLのタグ名をkeyとする連想配列」が格納されていることが分かる。また、ルートであるResultSetは、この中に見られない(ResultSetは全てを包含するSimpleXMLオブジェクトとなり、ResultSetの属性は、そのオブジェクト属性となっている)。

したがって、取得レコード(Resultタグ内)には、

$xml = simplexml_load_string(file_get_contents($url));

$wk=$xml->Result; // これで、Result属性を取得できる
    

でアクセスすることができる。そして、属性(の配列要素)は同時にオブジェクトとなっているので、

$xml = simplexml_load_string(file_get_contents($url));

$xml->Result; // これで、Result属性を取得できる

$wk=$xml->Result[0]->Title;
   
var_dump($wk); 

で、

object(SimpleXMLElement)#5 (1) { [0]=> string(28) "Opera-Browser kommt ins BIOS" }

という結果を得ることができる。

この結果を元に、先と同じ結果を得るphpプログラムを作成したので、以下に示す。
一般のMashupはこんな感じでやればいいだろう。

<?php

$wkGET=$_GET["query"];

// spaceを+に置換 (opera+browserで送っても、opera browserで届いたとき)
$wkGET=str_replace(' ','+',$wkGET);

$queryString.='query='.$wkGET;

$url = 'http://search.yahooapis.com/NewsSearchService/V1/newsSearch?appid=YahooDemo&'.$queryString; 

// データの取得
$xml = simplexml_load_string(file_get_contents($url));

// レスポンスデータの準備
$res='<ul>';
foreach($xml->Result as $record){
	$wkEl='<li><a href="'.$record->ClickUrl.'">'.$record->Title.'</a>'.
		'<cite>'.$record->NewsSource.'</cite></li>';
	$res.=$wkEl;
}
$res.='</ul>';

// 結果の返却
echo $res;
?>