ParseAmazonXMLクラスは以下のようにすることにした。
ネームスペースを入れないと、child()が使えないので、その部分を省いて使えるようにしただけのもの。
package classes.xml{ public class ParseAmazonXML{ //xmllist:検索対象のxmlのリスト,uri:ネームスペースのuri,nodename:抽出対象のノード名 public static function getList(xmllist:XMLList,uri:String,nodename:Array):XMLList{ var qname:QName=new QName(uri,nodename.shift()); xmllist=xmllist.child(qname); if(nodename.length>0){ xmllist=ParseAmazonXML.getList(xmllist,uri,nodename); } return xmllist; } } }
呼び出し側は、以下のような感じで使うことになる。
package classes.test{ import classes.xml.*; import flash.events.*; import flash.net.*; import flash.display.*; public class TestMain extends MovieClip{ public function TestMain(){ var lax:LoadAmazonXML=new LoadAmazonXML(); lax.addListener(Event.COMPLETE,dispData); //URLを生成させる。パラメータは:amazonECSのOperation、BrowseNodeId lax.makeURL("BrowseNodeLookup",["465610"]); lax.load(); } public function dispData(eventObj:Event):void{ var xml:XMLList=XMLList(eventObj.target.data); var uri:String=xml.namespace().uri; var idl:XMLList=ParseAmazonXML.getList(xml,uri,["BrowseNodes","BrowseNode", "Children","BrowseNode","BrowseNodeId"]); var nml:XMLList=ParseAmazonXML.getList(xml,uri,["BrowseNodes","BrowseNode", "Children","BrowseNode","Name"]); for(var i:Number=0;i<idl.length();i++){ trace(idl[i].text()); trace(nml[i].text()); } } } }
LoadAmazonXML(URLLoaderクラスをカスタマイズしたようなもの)のリスナーハンドラの中に書き込む感じになる。
ノードの名前を、階層順に配列で渡して検索させる。
とりあえず、xpathに似た感じでデータを抽出できる。
上を実行すると
466284 文学・評論 571582 人文・思想 571584 社会・政治 492152 ノンフィクション 466286 歴史・地理 466282 ビジネス・経済・キャリア 492054 投資・金融・会社経営 466290 科学・テクノロジー 492166 医学・薬学 466298 コンピュータ・インターネット 466294 アート・建築・デザイン 466292 実用・スポーツ・ホビー 492228 資格・検定 466304 暮らし・健康・子育て 492090 旅行ガイド 466302 語学・辞事典・年鑑 3148931 教育・学参・受験 466306 こども 466280 コミック・アニメ・BL 500592 タレント写真集 492266 ゲーム攻略本 466296 エンターテイメント 466300 新書・文庫 13384021 雑誌 746102 楽譜・スコア・音楽書 13383771 ポスター 10667101 アダルト
というリストが得られる。