楽天 API と simplexml_load_file

サーバのphpが5になったってことはxmlが扱いやすくなったんだっけ?というわけで楽天の商品検索APIをさわってみました。

php5なんだから simplexml_load_file を使ってみようと調べてみたら、それってずるいんじゃね?ってぐらい簡単。呼び出すだけ。

でも、なぜかちゃんと読み込まれません。中身を吐き出させてみると、空。いろいろググってみたら、名前空間がどうのこうので、つまりタグ(?)の中に:(コロン)があるとうまく動かないとのこと。というわけでメモ。見つけた解決策はこう。

$addr = '目的のアドレス';
$tmpData = file_get_contents($addr);
$tmpData = str_replace('header:Header', 'Header', $tmpData);
$tmpData = str_replace('itemSearch:ItemSearch', 'ItemSearch', $tmpData);
$xml = simplexml_load_string($tmpData);

とりあえず持ってきて、引っかかる部分を置き換えて、読み込ませる、ということらしいです。商品検索API以外の場合は2つめの置換、ItemSearch のところが変わります。たぶん。

あと引っかかったのが、直接xmlを読む場合は simplexml_load_file ですが、この場合は simplexml_load_string になってます。これ見落として30分ぐらい…。:oops:

調べてる途中でわかったんですが、どうやら途中の仕様変更でこうなったそうです。どおりで解説ページとかでもスルーされてるはずです。試してみると2007-02-14までのバージョンでAPIから取り出すと大丈夫でした。ちなみにxmlとしては問題なくてsimpleXMLの変な動きが原因なのだとか。

というわけでそのうちなんか公開するかも。そのまえに以前作ったAmazon用のを改造してもっと使いやすくするのが先?

追記

simpleXML でもちゃんと名前空間付きの xml (って表現でいいのか分からんけど)を扱う方法は用意されているらしいです。

.☆★ ステレオタイプラボ ★☆. [php]simplexml_load_fileでうまくパース出来ない、なんて事はない。& 正解とお手軽方法
SimpleXMLで名前空間付きタグの一覧を取得する – 肉とご飯と甘いもの @ sotarok

Children なんてのを使うらしいですが…ワタシにはよく分かりません。:oops:
物事はなんでもキッチリ処理しないと気持ちが悪い、落ち着かない、イライラするッ!という方は是非お試し下さい。

12件のコメント

  1. うわー ありがとうございます!
    どうしてもうまくいかなくて色々方法を変えてトライ&エラーでやってました。
    半日悩んで、このブログにたどり着きました。
    今、この方法で無事に動作しました!
    本当に助かりましたm(_ _)m

  2. 自分も同じところでつまっておりました。。
    1週間くらいハマりそうな予感がしていたのですが、
    この記事を読んですぐに解決することができました。
    本当にありがとうございます!

  3. 😛 悩んで先に進めなかった部分が解決しました。
    ありがとうございました。

     私は、楽天BooksAPIだったので、文字列置換が異なっていました。
    変更したら、読み込めましたが、ネスト(?)の部分で、また躓きましたが、やっと自己解決しました

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です