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; ?>