PHP5で楽天トラベルキーワード検索APIを利用する方法とは?

このQ&Aのポイント
  • 楽天ウェブサービスの楽天トラベルキーワード検索APIを、PHP5で利用する方法について教えてください。
  • 名前空間で定義されている出力パラメータを取得する際にエラーが発生してしまいます。
  • IBMの「PHPでのSimpleXML処理」を参考にしましたが、正しいコーディング方法を教えてください。
回答を見る
  • ベストアンサー

PHP5で名前空間を取り扱う

楽天ウェブサービスの楽天トラベルキーワード検索APIを、PHP5で利用しようとしています。    ■楽天トラベルキーワード検索API     http://webservice.rakuten.co.jp/api/keywordhotelsearch/ 出力パラメータの一部は名前空間で定義されており、下記の参考Webサイトのコーディング例に従ってソースを実行しましたが、children関数を実行する行で、 "Fatal error: Call to a member function children() on a non-object in " と表示されてしまいました。 どのようにコーディングするのが正しいのか、教えていただけないでしょうか。 ■参考にしたWebサイト 「IBM PHPでのSimpleXML 処理」 http://www-06.ibm.com/jp/developerworks/xml/library/x-simplexml.shtml?ca=drs ■実行ソース $xml = simplexml_load_file($restURL) or die("XMLパースエラー"); $cd = $xml->Response->header->children('http://api.rakuten.co.jp/rws/rest/Header'); ■実行環境  PHP Version 5.1.4  Apache 2.0 Handler ■xmlの構造 <?xml version="1.0" encoding="UTF-8" ?> <Response> <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> <Args> <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)">true</Arg> <Arg key="developerId" value="****">true</Arg> <Arg key="affiliateId" value="****">true</Arg> <Arg key="operation" value="KeywordHotelSearch">true</Arg> <Arg key="version" value="2007-04-11">true</Arg> <Arg key="keyword" value="アートホテルズ札幌">true</Arg> </Args> <Status>Success</Status> <StatusMsg /> </header:Header> <Body> <keywordHotelSearch:KeywordHotelSearch xmlns:keywordHotelSearch="http://api.rakuten.co.jp/rws/rest/KeywordHotelSearch/2007-04-11"> <hotelSimple> <hotelNo>5903</hotelNo> <hotelName>アートホテルズ札幌</hotelName> <areaSum /> <hotelSpecialSum /> <middleClassCode>hokkaido</middleClassCode> <smallClassCode>sapporo</smallClassCode> <hotelInformationUrl>http://img.travel.rakuten.co.jp/image/tr/api/kw/JBe8h/?f_no=5903</hotelInformationUrl> <hotelAffiliateUrl>http://***/hgc/04230ff1.13a55c09.04230ff2.eed97e0f/?pc=http%3A%2F%2Fimg.travel.rakuten.co.jp%2Fimage%2Ftr%2Fapi%2Fkw%2FJBe8h%2F%3Ff_no%3D5903</hotelAffiliateUrl> </hotelSimple> <recordCount>1</recordCount> </keywordHotelSearch:KeywordHotelSearch> </Body> </Response>

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • pochichi
  • ベストアンサー率100% (1/1)
回答No.2

ストレートにSimpleXMLで読込はできないようですね。 次のやり方でoKでした。 $restData = file_get_contents($apiurl)); $restData = str_replace('header:Header', 'Header', $restData); $restData = str_replace('getAreaClass:GetAreaClass', 'GetAreaClass', $restData); $xml = simplexml_load_string($restData);

参考URL:
http://www.dayofglory.jp/archives/ent-000100.html
Gooooooogle
質問者

お礼

ありがとうございます。 うまく行きました。

その他の回答 (1)

  • pochichi
  • ベストアンサー率100% (1/1)
回答No.1

$cd = $xml->Response->header->children('​http://api.rakuten.co.jp/rws/rest/Header');​ のところの「Response->」をなくすとどうでしょう?

関連するQ&A

  • phpのsimplexml_load_fileについて

    あるXMLのデータをsimplexml_load_fileで実行すると SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) という内容が返ってきます。 しかし、そのXMLのデータの内容は <?xml version="1.0" encoding="UTF-8" ?> - <Response> - <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> - <Args> <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ) Sleipnir/2.5.12">true</Arg> <Arg key="apiVersion" value="111">true</Arg> <Arg key="operation" value="ItemSearch">true</Arg> <Arg key="version" value="2007-10-25">true</Arg> </Args> <Status>Success</Status> <StatusMsg /> </header:Header> - <Body> - <itemSearch:ItemSearch xmlns:itemSearch="http://api.rakuten.co.jp/rws/rest/ItemSearch/2007-10-25"> <count>19244</count> <page>1</page> <first>1</first> <last>30</last> <hits>30</hits> <carrier>0</carrier> <pageCount>100</pageCount> - <Items> - <Item> <itemName>内容1</itemName> <itemCode>crucian:10001064</itemCode> <itemPrice>1</itemPrice> <itemCaption>内容2</itemCaption> <itemUrl>URL1</itemUrl> <affiliateUrl /> <imageFlag>1</imageFlag> <smallImageUrl>画像1</smallImageUrl> <genreId>403911</genreId> </Item> ------------------------------ こんな感じのデータです。 ブラウザでこのXMLを表示させても、この様に表示されます。 SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) この結果が意味しているものは、[Body]以下のものは何も返ってきていないという事なのでしょうか? ここから、普通に内容1・内容2・URL1・画像1(上記のXMLデータの内容)を取り出すには、どうすればよいのでしょうか? 教えて頂けると非常に助かります。

    • 締切済み
    • PHP
  • simplexml_load_file でデータがうまく取得できない

    楽天ウェブサービスの楽天トラベルキーワード検索APIを、 PHP5でsimplexml_load_fileにより利用しているのですが、うまくゆきません。 ■楽天トラベルキーワード検索API http://webservice.rakuten.co.jp/api/keywordhotelsearch/ 1.現象 simplexml_load_fileで取得したデータをprint_rで表示させると、下記のように、ヘッダ(共通パラメーター)の部分が取得できません。 しかしながら、ブラウザからリクエストURLを直打ちすると、正常にデータが取得できていることがわかります。 ■print_rでの出力結果 -------------------------------------------------- SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) -------------------------------------------------- ■コーディング $xml = simplexml_load_file($restURL) or die("XMLパースエラー"); echo "<pre>"; print_r($xml); echo "</pre>"; ■ブラウザにリクエストURLを直打ちして出力した結果 -------------------------------------------------- <Response>  <header:Header>   <Args>    <Arg key="User-Agent" value="Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6">true</Arg>    <Arg key="developerId" value="****">true</Arg>    <Arg key="affiliateId" value="****">true</Arg>    <Arg key="operation" value="KeywordHotelSearch">true</Arg>    <Arg key="version" value="2007-04-11">true</Arg>    <Arg key="keyword" value="アートホテルズ札幌">true</Arg> </Args> <Status>Success</Status> <StatusMsg/> </header:Header> <Body> <keywordHotelSearch:KeywordHotelSearch> <hotelSimple> …… -------------------------------------------------- なぜ、simplexml_load_fileで取得した場合がうまくいかないのか原因がわかりません。 ブラウザ直打ちの場合も、simplexml_load_fileの場合もリクエストURLは同一であることを確認しています。 ちなみに、楽天商品検索APIと楽天トラベル地区コードAPIは既に利用していますが、正常にデータが取得できています。 楽天商品検索APIと楽天トラベル地区コードAPIと、楽天トラベルキーワード検索APIとでの 出力結果の差異は、正常にデータ取得できているAPIの共通パラメーターと呼ばれる部分の名前が、 "<Header>"となっていることです。 楽天トラベル地区コードAPIの場合は、 " <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> " です。 これが原因なのかなとも思いましたが、対処法がわかりません。 どなたかアドバイスをお願いいたします。

    • 締切済み
    • PHP
  • linq で 楽天ウェブサービスのXMLの処理で

    vb2008を使って、楽天ウェブサービスから取得したXMLデータを処理しようとしています。 楽天ウェブサービス 楽天ジャンル検索API http://webservice.rakuten.co.jp/api/genresearch/ しかし、<genreSearch:GenreSearch>の処理がうまくいかずに困っています。 Dim elementRakuten = XElement.Load(strRakutenGenreSearchUrl) でデータを受けた後、次のように取り出そうとしました。 elementRakuten.Element("Body").Element("genreSearch:GenreSearch") しかし「':' 文字、16 進数値 0x3A を名前に含むことはできません。」というエラーが出てしまいます。 欲しい情報は<child>の一覧です。 データはこのような感じです。 どのように処理すべきなのかご教授お願いします。 <Response> <header:Header xmlns:header="http://api.rakuten.co.jp/rws/rest/Header"> <Args> <Arg key="developerId" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx">true</Arg> <Arg key="apiVersion" value="20">true</Arg> <Arg key="operation" value="GenreSearch">true</Arg> <Arg key="version" value="2007-04-11">true</Arg> <Arg key="genreId" value="0">true</Arg> </Args> <Status>Success</Status> <StatusMsg></StatusMsg> </header:Header> <Body> <genreSearch:GenreSearch xmlns:genreSearch="http://api.rakuten.co.jp/rws/rest/GenreSearch/2007-04-11"> <child> <genreId>101240</genreId> <genreName>CD・DVD・楽器</genreName> <genreLevel>1</genreLevel> </child> <child> <genreId>100804</genreId> <genreName>インテリア・寝具・収納</genreName> <genreLevel>1</genreLevel> </child> <child> <genreId>551177</genreId> <genreName>メンズファッション・靴</genreName> <genreLevel>1</genreLevel> </child> </genreSearch:GenreSearch> </Body> </Response>"

  • XMLのスコープの範囲を教えてください。

    1:<Response> 2: <header:Header xmlns:header="http://ABC"> 3:  <Args> 4:   <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</Arg> 5:  </Args> 6:  <Status>Success</Status> 7:  <StatusMsg /> 8: </header:Header> 9:</Response> 以上のようなXMLがあると、2行目のxmlns:header="http://ABCのスコープは、8行目まで全て続くと考えてよろしいのでしょうか? 私は、 1:<Response> 2: <header:Header xmlns:header="http://ABC"> 3:  <header:Args> ←変更 4:   <header:Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</header:Arg>  ←変更 5:  </header:Args> ←変更 6:  <header:Status>Success</header:Status>  ←変更 7:  <header:StatusMsg />  ←変更 8: </header:Header> 9:</Response> もしくは 1:<Response> 2: <Header xmlns="http://ABC"> ←変更 3:  <Args> 4:   <Arg key="User-Agent" value="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)">true</Arg> 5:  </Args> 6:  <Status>Success</Status> 7:  <StatusMsg /> 8: </Header> ←変更 9:</Response> って書くのが普通ではないのかなと考えています。 どうかご教授お願いします。

    • ベストアンサー
    • XML
  • 名前空間のあるXMLからの取り出し

    お世話になります。 <?xml version="1.0" encoding="UTF-8" ?> <Response> <header:Header xmlns:header="http://aa.com"> </header:Header> <Body> <itemCodeSearch:ItemCodeSearch xmlns:itemCodeSearch="http://bb.com"> <Item> <itemName>@@@@</itemName> </Item> </itemCodeSearch:ItemCodeSearch> </Body> </Response> から、@@@@の部分を抜き出し取得したいのですが、ご存知の方いらっしゃいませんでしょうか? simplexml_load_string()で抜き出すときには、: があるとうまくいかないということですが・・ 全体が$xmlにはいっているとして、 $xml->Body->itemCodeSearch->Item->itemName; とし、うまくいっていたのですが、名前空間がどうのというエラーが発生したりします。 ご存知の方ご教授ください。 宜しくお願いします。

    • 締切済み
    • PHP
  • multiRequest関数で楽天API使用方法

    multiRequest関数にて楽天含め2つのAPIを使用したいのですが、同時にmultiRequest関数で叩くと file_get_contents関数(楽天のコロンを取り除く為)でエラー表示が起きてしまいます。 以下、エラー表示部分 Warning: file_get_contents(<?xml version="1.0" encoding="UTF-8"?><Response><header:Header xmlns:header="http://...・・・・・・<reviewAverage>4.81</reviewAverage><pointRate>1</pointRate><pointRateStar in C:\xxxxx\xxxxx\search.php on line 306 以下、記述内容 $data = array( "http://api.rakuten.co.jp/rws/3.0/rest?developerId=xxxxx&operation=ItemSearch&version=2010-09-15&keyword=$word", "http://productsearch.linksynergy.com/productsearch?token=xxxxxx&keyword=$link_keyword", ); var_dump($data); $r = multiRequest($data); $data = file_get_contents($r[0]); $data= str_replace('itemSearch:ItemSearch', 'itemsearch', $data); $xml = simplexml_load_string($r); print_r($xml); ?>               ここまで。 尚、$xml = simplexml_load_string($r); の上2行を削除し、$xml = simplexml_load_string($r[1]); とした場合はもう1つのAPIの取得は出来ました。 また今、$dataと$rの変数が誤ってる事は存じております。 恐らく、file_get_contents関数の記述がおかしいのかとは思いますが、何がおかしいのか分かりません。 もしかしたら単純な事なのかもしれませんが、調べても全く出てこない為、分かる方がおりましたら、何卒お力添え頂けると助かります。

    • 締切済み
    • PHP
  • PHP4でのXMLデータの取り扱い

    Webサービスを利用してXMLデータを取得するスクリプトをPHPで書いています。レンタルサーバの関係でバージョンは4.4.4しか使えません。 XMLを扱う関数というと、PHP5ではsimpleXMLやXMLReaderなどがあるようで、各要素へアクセスするにも $xml=simplexml_load_file('books.xml'); foreach($xml->book as $book){ .... という感じでオブジェクトとしてアクセスできるようですが、こういうのをPHP4で実現する方法はないのでしょうか?例えば入れ子になったデータだと、深い階層にたどりつくために foreach($results as $key => $value){ foreach($value $key2 => $value2){ foreach($value $key3 => $value3){ ... } } } みたいな感じで書いているのですが、まったくスマートではないですし、なにか間違っているような気がします。良い方法があればお教えください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • $xml要素を階層指定して取得しようとすると、NULLになるのですが…

    $xml要素を階層指定して取得しようとすると、NULLになるのですが…。 ▽元のXMLファイル(楽天トラベルAPI) <Response> _<Body> __<KeywordHotelSearch:KeywordHotelSearch> ___<hotel> ____<hotelBasicInfo> _____<hotelNo>7531</hotelNo> _____<hotelName>パークハイアットホテル</hotelName> ▽$xml = simplexml_load_string($xml);した際の、var_dump($xml) object(SimpleXMLElement)#1 (2) { ["headerHeader"]=> object(SimpleXMLElement)#2 (3) { ["Args"]=> object(SimpleXMLElement)#4 (1) { ["Arg"]=> array(7) { [0]=> string(4) "true" [1]=> string(4) "true" [2]=> string(4) "true" [3]=> string(4) "true" [4]=> string(4) "true" [5]=> string(4) "true" [6]=> string(4) "true" } } ["Status"]=> string(7) "Success" ["StatusMsg"]=> object(SimpleXMLElement)#5 (0) { } } ["Body"]=> object(SimpleXMLElement)#3 (0) { } } object(SimpleXMLElement)#8 (0) { } この後、$items = $xml->Body->KeywordHotelSearchKeywordHotelSearch->hotel->hotelBasicInfo; とやると、$itemsが NULL になるのですが、何故でしょうか? (※KeywordHotelSearch:の:は、simplexml_load_stringする前に、str_replaceで処理済です) ちなみに、$items = $xml->Body->KeywordHotelSearchKeywordHotelSearch;では、$itemsは下記になります。 object(SimpleXMLElement)#4 (0) { }

    • ベストアンサー
    • PHP
  • PHP初心者です。

    PHP初心者です。 楽天APIを利用し、PHPでパラメータを作成、以下のスクリプトでxslファイルを呼び出しHTMLに成形しました。 (developerIdとaffiliateIdは架空のものです) ---------------------------------------------------------------------------------- <?php $developerId = '1234567891234567891234567891234'; $affiliateId = '12345678912345678912345678912345'; function urlencode_rfc3986($str) { return str_replace('%7E', '~', rawurlencode($str)); } $baseurl = 'http://api.rakuten.co.jp/rws/2.0/rest'; $params = array(); $params['developerId'] =$developerId; $params['affiliateId'] = $affiliateId; $params['version'] = '2009-04-15'; $params['operation'] = 'ItemSearch'; $params['hits'] = '30'; $params['Keywords'] = '××'; $params['page'] = '1'; $params['minPrice'] = '1000'; $params['maxPrice'] = '5000'; $params['availability'] = '1'; $params['imageFlag'] = '0'; $params['genreId'] = '100026'; foreach ($params as $key => $value) { $api .= '&'.$key.'='.$value; } $url = $baseurl.'?'.$api; ?> <?php $xml = new DomDocument(); $xml->load($url); $xsl = new DomDocument(); $xsl->load('item.xsl'); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); ?> ---------------------------------------------------------------------------------- これをphp includeで別のHTMLファイルに呼び出したところ、成形されたHTMLタグの一番上に、 truetruetruetruetruetruetruetruetruetruetruetrueSuccess158711130300100 という文字列が返されます(最後の数字はアクセスするたびに変わります)。 この文字を表示させないためにはどのような構文にすればいいのでしょうか。 ご示唆をお願いします。

    • 締切済み
    • PHP
  • ヘッダーが付いた場合の、simplexml_load_fileでの取り出し方

    simplexml_load_file()を使って <?xml version="1.0" encoding="UTF-8" ?> - <Response> - <header:Header xmlns:header="http://test.com/"> </header:Header> - <Body> - <itemSearch:ItemSearch xmlns:itemSearch="http://test.com/"> <count>2000</count> <page>1</page> ...... この<count>2000</count> の「2000」を取り出すにはどうしたらよういのでしょうか? echo $Xml->Response->Body->itemSearch->count; このXML文書の構成様式が初めてで(ヘッダーが付いている)、いくらやっても 取得できないので宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう