マッシュアップのための第二歩目:FlashでAPIからXMLを呼んだときはxmlnsに注意する(2)

このエントリの続きです。今回はHotPepperAPIを使って適当なお店の名前と住所とキャッチコピーをゲッツします。

いきなりハマる

普通にXMLをE4Xで解釈して trace(dataXML.shop[i].catch) と書くとエラーが出ます。これはどういうことか。クーピーさんのこのエントリによれば、catch というのは try~catch の名前とバッティングしてしまうから、らしいです。で、解決方法も書いてあるんですがよくわかりません。

trace(xml.ns::["catch"][0]); // 出力 :: Flasher 募集中!

こういう書き方でいいらしいんですけど、このns::をどこにつけたらいいのかが、このエントリからはサッパリ分かりません。たとえば、xml本体が dataXML.shop[i].catch だった場合はどこにns::をつけるの? ということです。

困ったときはtrick7

で、探してみたらやっぱりteraさんが書いてました。プレゼンも面白いしイケメンだし有名人だし凄いです。激アツじゃないですか。

dataXML.shop[i].ns::["catch"]

結論から書くとこういう感じです。
これを使ったサンプルとコードは以下。

import fl.containers.ScrollPane
import flash.utils.escapeMultiByte;
Security.loadPolicyFile("http://webservice.recruit.co.jp/hotpepper/crossdomain.xml");
var url:String ="http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=";
var key:String ="リクルートAPIキーを取得してね!!";
var service:String = "&keyword=";
var dataXML:XML;
function loadXML():void {
var req:String ="たこ焼き"
var hpRequest:String = escapeMultiByte(req);
var _url:URLRequest = new URLRequest(url+key+service+hpRequest);
var ldr = new URLLoader();
ldr.addEventListener(Event.COMPLETE,completeHandler);
ldr.load(_url);
}
function completeHandler(e:Event):void {
dataXML = new XML(e.target.data);
namespace ns= 'http://webservice.recruit.co.jp/HotPepper/'
use namespace ns;
for(var i:uint=0;i<dataXML.shop.length();i++){
var panel:MovieClip = new KekkaPanel()
panel.t1_txt.text =dataXML.shop[i].name
panel.t2_txt.text =dataXML.shop[i].address
panel.t3_txt.text =dataXML.shop[i].ns::["catch"]
panel.y = 80 * i
addChild(panel)
}
}
loadXML();

この記事には、カテゴリ AS3 タグは , がつけられています。