PHP :: SimpleXMLElement で xpath

Yahoo ショッピング の 商品検索 API で XML のパースに xpath を使った時のメモ。
ちなみに、同APIには 取得形式として「PHP seriallize」があり、PHPのシリアライズ化されたデータでの取得も可能ですが、今回はどうしても xpath を使ってみたかったので、XML で取得します。

XML の取得

API をたたくと、以下のような XML データが取得できます。

$url = 'http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid=<APPID>&query='.urlencode('パソコン');
$xml = file_get_contents($url);
var_dump($xml);


 ↓ 取得結果

<?xml version="1.0" encoding="UTF-8"?>
<ResultSet xsi:schemaLocation="urn:yahoo:jp:itemSearch http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch.xsd" 
xmlns="urn:yahoo:jp:itemSearch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" totalResultsAvailable="168044" 
totalResultsReturned="20" firstResultPosition="1">
   <Result>
      <Request>
         <Query>パソコン</Query>
      </Request>
      <Modules />
      <Hit index="1">
         <Name>TOSHIBA 東芝 PST422FCWZR1U dynabook Satellite T42 216C/5W A4 ノートパソコン</Name>
         <Description>★在庫有り!即日発送可!  CPU Intel Celeron プロセッサー 585 2.16GHz …(snip) …</Description>
         <Headline>延長保証受付中!在庫有り!</Headline>
  :
 (snip)
  :


xpath でパースする

$url = 'http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid=<APPID>&query='.urlencode('パソコン');
$xml = file_get_contents($url);
 
// SimpleXMLElement オブジェクト
$sxe = new SimpleXMLElement($xml);
 
// 名前空間の登録
//  今回はプレフィクス「y」を登録
$sxe->registerXPathNamespace('y', 'urn:yahoo:jp:itemSearch');
 
// HIT数 の取得
$res = $sxe->xpath('//y:ResultSet/@totalResultsAvailable');
echo "HIT数: {$res[0]}".PHP_EOL;
 
// 最初にHITした商品名 の取得
$res = $sxe->xpath('//y:Result/y:Hit/y:Name');
echo "最初にHITした商品名: {$res[0]}".PHP_EOL;
exit;


 ↓ 結果

HIT数: 168044
最初にHITした商品名: TOSHIBA 東芝 PST422FCWZR1U dynabook Satellite T42 216C/5W A4 ノートパソコン