• 締切済み

PHP5でAPIの結果をXMLパースし参照する方法を教えて下さい。

下記の様に、APIから情報をXMLパースすることは成功しましたが どうやって使用したらいいか分かりません。 例えば、Itemの0番のパソコンから簡単デジカメプリント注文【1枚15円】Lサイズ・DSCサイズを参照するには $xml->Body->ItemSearch->Items->Item[$i]->itemName だと思うのですが参照出来ません。 ご存じの方が」いらっしゃいましたら教えて下さい。 ------------------------------- SimpleXMLElement Object ( [Header] => SimpleXMLElement Object ( [Args] => SimpleXMLElement Object ( [Arg] => Array ( [0] => true ) ) [Status] => Success [StatusMsg] => SimpleXMLElement Object ( ) ) [Body] => SimpleXMLElement Object ( [ItemSearch] => SimpleXMLElement Object ( [count] => 23003 [page] => 1 [first] => 1 [last] => 30 [hits] => 30 [carrier] => 0 [pageCount] => 100 [Items] => SimpleXMLElement Object ( [Item] => Array ( [0] => SimpleXMLElement Object ( [itemName] => パソコンから簡単デジカメプリント注文【1枚15円】Lサイズ・DSCサイズ [itemCode] => gifucamera:843827 [itemPrice] => 15 [itemCaption] => DPEggと楽天からの二重請求が発生しないよう当店にて処理致します。 [itemUrl] => http:// [shopName] => カメラと写真の専門店ギフカメラ [shopCode] => gifucamera [shopUrl] => http://www.rakuten.co.jp/gifucamera/ [genreId] => 101750 ) [1] => SimpleXMLElement Object....続く (

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

みんなの回答

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.2

もしかして 0番のアイテムが取りたいのに単純に $xml->Body->ItemSearch->Items->Item[$i]->itemName って記載しているわけじゃないですよね。 0番取得なら $xml->Body->ItemSearch->Items->Item[0]->itemName 帰ってきた値をとるなら・・・ for($i=0;$i<30;$i++){ echo $xml->Body->ItemSearch->Items->Item[$i]->itemName; } などで表示できませんか? それでもだめなようなら、以下の確認を ・RESTですか? ・パースした関数は?例:simplexml_load_fileなど ・動いている環境はPHP5ですか?

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.1

これは楽天のItemSearchですよね? 私は、 $xml->Body->ItemSearch->Items->Item[$i]->itemName で問題なく取得できています。 帰ってくるXMLはUTF-8ですけど、サイトのキャラクターセットと あわせていますか?

pokopen17
質問者

お礼

早速の返答ありがとうございます。 そうです、楽天のitemsearchを試しています。 サイトのキャラクターセットはUTF-8ですので問題ないと思います。 試しに、 print_r($xml->Body); で$xmlを表示すると問題なく表示していますが SimpleXMLElement Object ( [ItemSearch] => SimpleXMLElement Object ( [count] => 23753 [page] => 1 [pageCount] => 100 [Items] => SimpleXMLElement Object ( [Item] => Array ( [0] => SimpleXMLElement Object print_r($xml->Body->ItemSearch); を入力して参照すると下記の情報が帰ってきます。 SimpleXMLElement Object ( ) うーん理解できない・・・

関連するQ&A

  • PHP5でxml文書をパースする方法

    <?xml version="1.0"?> <root> <items>  <item>   <id>1</id>   <name>商品(赤)</name>   <price>1500</price>   <color>red</color>   <size>8</size>   <option>A</option>  </item>  <item>   <id>2</id>   <name>商品(青)</name>   <price>700</price>   <color>blue</color>   <size>3</size>  </item>  <item>   <id>3</id>   <name>商品(緑)</name>   <price>1200</price>   <color>green</color>   <size>5</size>   <option>C</option>  </item> </items> </root> 上記のようなXMLデータをPHPでパースし、 1つずつ、配列に入れていきたいと考えていますが、 問題なのは、 上から2番目の商品(青)には、<option>データが無いということです。 これは、この<option>が、オプションが有る時にだけ存在するタグだからです。 //----------------------------- <?php $doc->load($url); //上記xmlデータのあるURL:$url $array = array(); $i = 1; while($i <= 3){  //実際には、もっと商品数はあります。ここでは例として、3。  //配列の初期化  $item_array = array();  $items = $doc->getElementsByTagName('id');  $item_array['id'] = $items->item($i)->nodeValue;  $items = $doc->getElementsByTagName('name');  $item_array['name'] = $items->item($i)->nodeValue;  //*  //*同様のコードが続く  //*  $items = $doc->getElementsByTagName('option');  $item_array['option'] = $items->item($i)->nodeValue;  //*  //*同様のコードが続く  //*  //商品データが詰まった配列を、さらに配列に入れる  $array[] = $item_array; } //全ての商品のデータが詰まった配列を表示する。 print_r($array); ?> //----------------------------- このようなことがしたいわけです。 なお、タグ名を$tag_array = array('id','name',,,,,'option',,,)として、 foreach($tag_array as $tag){  $items = $doc->getElementsByTagName($tag);  $item_array[$tag] = $items->item($i)->nodeValue; } という風にした方が冗長ではないかとは思いますが、 それは、まぁ横に置いておきまして、 このコードで問題なのは、<option>が途中、つまり2番目で抜けると、 3番目の<option>データが、2番目の商品の<option>データとして配列に入ってしまうことです。 上から順に詰めて、配列に格納されてしまい、困っている、ということです。 <option>データが無い場合は、「ナシ」とでもしておきたいのですが、 どうしたら良いでしょうか? <item>を1つずつ   $items = $doc->getElementsByTagName('item'); で取得して、 各<item>の中の、<option>にアクセスする、なんて方法があるとベストなのですが、 そんな方法はありますでしょうか? firstChildですと、<item>の場合、<id>になってしまうため、<option>にはアクセスできません。 firstChild以降のChildには、どうやってアクセスしたら良いのでしょうね? どなたか、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP5でのXMLパーサーについて

    PHP5で $xml = simplexml_load_file($url)を使って ヤフーオークションAPIから帰ってきたデータを処理したいのですが、 titleは {$xml->item[0]->title}で取得できることがわかったのですが、 totalAuctionsなど@attributesの中のデータを取得することができません。 どのようにすればよいかご教授願います。 よろしくお願いします。 SimpleXMLElement Object (  [@attributes] => Array  (   [totalAuctions] => 3677   [totalPage] => 74   [curPage] => 1  )  [item] => Array  (   [0] => SimpleXMLElement Object   (    [auctionID] => *****    [title] => ******    [seller] => SimpleXMLElement Object     (      [id] => ***      [itemlist] =>http://api.auctions.yahoo.co.jp/AuctionWebService/V1/SellingList?sellerID=***      [rating] =>ttp://rating2.auctions.yahoo.co.jp/jp/show/rating?userID=***     )      [url] => http://********************************      [img]=>http://**********************************.jpg      [price] => **,000 円      [bids] => **      [endtime] => *月 **日 **時 **分      [reserved] => SimpleXMLElement Object       (       )      [option] => SimpleXMLElement Object      (       [0] =>      )     )   ) )

    • ベストアンサー
    • 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の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
  • PHPでHTMLをXMLに変換したときに消える内容

    教えてください。 スクレイピングのために、よく分からないままに、 PHPでHTMLをXMLに変換して、Xpathで参照しようとしています。 が。 その前段で、「HTML内に存在する内容が、XMLに変換した際に 消えてしまう」という現象に悩まされております。 例を挙げますと、 --------------------------------------- <html> <body> <table> <tr> <td><b>foo</b> bar<br> </td> </tr> </table> </body> </html> --------------------------------------- みたいなページを、 --------------------------------------- <?php $html = file_get_contents('http://xxxxxxxxxxxxxxxxx.com/foobar.html'); $dom = new DOMDocument(); @$dom->loadHTML($html); $xml = simplexml_import_dom($dom); print_r($xml); ?> --------------------------------------- のように処理すると、 --------------------------------------- SimpleXMLElement Object ( [body] => SimpleXMLElement Object ( [table] => SimpleXMLElement Object ( [tr] => SimpleXMLElement Object ( [td] => SimpleXMLElement Object ( [b] => foo [br] => SimpleXMLElement Object ( ) ) ) ) ) ) --------------------------------------- のような結果になって、「あれ?fooはいるけど、barは何処いった?」となります。 分かっている方には、「そりゃ、おまえ、あたりまえだよwww」 「つーか、なにやっとんのwww」って感じなのかもしれませんが、 さっぱり分かりません。 元のHTMLの書きぶりがダメだからということでしょうか。 お手数をお掛けしますが、どうぞ、ご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Yahoo APIのXMLの取得について

    Yahoo APIのXMLで総数(totalResultsAvailable)を取得したいのですが、取得できません。 $url = "http://api.search.yahoo.co.jp/WebSearchService/xx/webSearch?appid=xxxxx&query=$query"; $xml= simplexml_load_file($url); $yahooxml=$xml->Result->Item ; $totalResults = $yahooxml->{totalResultsAvailable}; print_r ($totalResults); $urlは問題なく値が入ってるのですが、$totalResults ではSimpleXMLElement Object ( ) と返ってきてしまいます。どうすれば、$totalResults の値を取得できるのでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで配列を使ってHTMLソースを取得したいです

    RSSで取得したXMLの中身からURLを取得したのですが、 それぞれのソースをループ構文を使って取得する方法はありますか? XMLの中身を配列として表示すると ソース↓ $RSS_data = simplexml_load_file($RSS_url); $i=0; foreach($RSS_data->URL as $value){ $result [$i] ['URL'] = $value->URL; $i++; } echo "<pre>" ; print_r($result) ; echo "</pre>" ; 結果↓ Array ( [0] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www.~ ) ) [1] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www~ ) ) [2] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www.~ ) ) [3] => Array ( [URL] => SimpleXMLElement Object ( [0] => http://www.~ ) ) こんな感じで続いていきます。 このURLの一つ一つのソースを取得したいのですがどうすればいいのでしょうか?

    • 締切済み
    • PHP
  • XMLのタグの有無をPHPで判定したい。

    example1.xml ----------------------- <item>  <color>red</color>  <omake>candy</omake> </item> ----------------------- example2.xml ----------------------- <item>  <color>black</color> </item> ----------------------- 上記はXMLファイルの2パターンを示したものです。 商品(item)によって、オマケ(omake)があったりなかったりします。 オマケがない時には、タグ自体存在しません。 なので、タグがない時に、そのデータをDOMで取得しようとすると、 エラーが吐かれます。 Notice: Trying to get property of non-object in~~~ 私がしたいことは、 タグがない場合には、値を取得しない。 という分岐をさせることです。 例えば、 $items = $doc->getElementsByTagName('color'); if(isset($items)){echo $items->item(0)->nodeValue;} こんな感じで考えたのですが、ダメでした。 タグが無くても、$itemsはNULLではないため、 if文の中に入ってしまい、 結局、$items->item(0)->nodeValue; を通過しようとして、 Notice: Trying to get property of non-object in~~~ が吐かれます。 ($itemsは、object(DOMNodeList)#3 (0) { }といった内容で、NULLではない。) また、 if(isset($items->item(0)->nodeValue)){  echo $items->item(0)->nodeValue; } のようにすると、 isset()のところで、やはり、 $items->item(0)->nodeValue を通過しようとして、 Notice: Trying to get property of non-object in~~~ が吐かれます。 こういった場合、どうしたら良いのでしょうか。 宜しくお願いします。 (PHP5の環境です。)

    • ベストアンサー
    • PHP
  • PHP4でXMLを取得する方法

    XMLをPHPにて参照したいのですが、 レンタルサーバーがPHP4の為、PearのXML_Unserializerを使用しています。 通常問題なく使用できていたのですが、 http://weather.livedoor.com/forecast/rss/index.xml から取得してみようとした所、<ldWeather:lwws id="*" /> の箇所がどうしても取得出来ません。 print_rにて確認したところ、[ldWeather:lwws]となっているのですが、コロンがある場合はどのように取得したらいいのでしょうか? 以下がコードになります require_once("Unserializer.php"); $add = "http://weather.livedoor.com/forecast/rss/index.xml"; $xmldoc = join("",file($add)); $opt = array ('complexType' => 'object','parseAttributes' => 'true','attribuesArray' => '_attributes'); $xml = new XML_Unserializer($opt); $xml -> unserialize($xmldoc, false); $xml = $xml->getUnserializedData(); mb_convert_encoding($xml, "SJIS","UTF-8"); print_r($xml->channel->item[1]->ldWeather:lwws);←ここが問題箇所 PHPを始めたばかりで説明に不十分な箇所があるかも知れませんが、よろしくお願い致します。 PHPバージョン:PHP Version 4.4.6 XML取得先:Livedoor Weather Web Service 利用目的:勉強の為

    • ベストアンサー
    • PHP
  • phpのSimpleXMLでXMLの要素を参照したい。

    フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。 ------------------ <?php $doc = new domDocument(); // DOMDocumentオブジェクトにより、インスタンスを生成 $doc->load("./beta.xml"); // ファイルからXML文書を読みこむ $kywd = $_REQUEST['kywd']; // フォームからデータを受け取る $nodelist = $doc->getElementsByTagName('keyword'); // 指定した要素名(keyword)の全ての要素を取得 foreach ($nodelist as $node) { // 各要素を参照 if($kywd == $node->textContent){ // もし、フォームから受け取ったデータが要素と一致したら $xurl = $node->namespaceURI; // 要素の名前空間URLを取得して$xurlに代入 $xml = simplexml_load_file("./beta.xml"); // SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する $parent = $xml->children("$xurl"); // 指定したノードの子ノードの配列を取得 $hairetsu = $parent[0]->children("$xurl"); //取得した配列素$hairetsuに代入 foreach($hairetsu as $key=>$value) { // ちゃんと連想配列になっているか、ためしに出力 print ($key."→".$value."<br />"); } // 連想配列になっていることを確認 print $hairetsu["title"]; // しかし、キーを指定して値を取得しようとすると、なぜか得られない。 } } ?> 問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう