flashのActionScriptで、BrowesNodeLookupのResponseデータから、トップカテゴリの情報を取得する。
とりあえずこんな感じ。
import classes.main.*; import classes.loadbar.*; import classes.xml.*; import mx.controls.*; class Main extends MovieClip{ private var mytimeline:MovieClip;//基準になるタイムライン_root private function onLoad():Void{ mytimeline=_root;//ターゲットタイムラインの参照取得 mytimeline.stop();//ロードを監視するためにタイムラインをストップ _root.loadbar.init(mytimeline,startMain,this);//ロードバー初期化:パラメータは監視対象、コールバック関数、コールバックオブジェクト } private function startMain():Void{ mytimeline.gotoAndStop("main");//検索画面へ移動 var myxml:LoadAmazonXML=new LoadAmazonXML(acceptXML,this);//amazon用のxmlクラスを作成。パラメータは:コールバック関数、コールバックオブジェクト myxml.makeURL("BrowseNodeLookup",["465610"]);//URLを生成させる。パラメータは:amazonECSのOperation、BrowseNodeId myxml.load();//amazonECSのルートのカテゴリを要求(465610はジャンル別を一覧できるノードのID) } private function acceptXML(xml:XMLNode):Void{ var browsenodeidlist:Array=ParseAmazonXML.getList(xml,"/BrowseNodeLookupResponse/BrowseNodes/BrowseNode/Children/BrowseNode/BrowseNodeId");//和図書トップカテゴリのBrowseNodeIdを取得 var categorynamelist:Array=ParseAmazonXML.getList(xml,"/BrowseNodeLookupResponse/BrowseNodes/BrowseNode/Children/BrowseNode/Name");//和図書トップカテゴリのNameを取得 for(var i:Number=0;i<browsenodeidlist.length;i++){ _root.test.text+=browsenodeidlist[i]+":"+categorynamelist[i]+newline; } } }
import classes.loadbar.*; class LoadBar extends MovieClip{ private var mytimeline:MovieClip; private var mycallbackfunc:Function; private var mycallbackobj:Object; public function init(timeline:MovieClip,callbackfunc:Function,callbackobj:Object){ this._xscale=0; mytimeline=timeline; mycallbackfunc=callbackfunc; mycallbackobj=callbackobj; this.onEnterFrame=function():Void{ var persentloaded:Number=mytimeline.getBytesLoaded()/mytimeline.getBytesTotal()*100; if(persentloaded<100){ changeScale(persentloaded); }else{ loadComplete(); } } } private function changeScale(scale:Number){ this._xscale=scale; } private function loadComplete(){ delete this.onEnterFrame; mycallbackfunc.call(mycallbackobj); } }
//大重美幸さんのFLASH ActionScript2.0を参考にしている import mx.controls.*; import classes.xml.*; class LoadAmazonXML{ private var urlstr:String; private var awsxml:XML; //callObj.callFunc()を実現するための引数⇒実際にはcallFunc.call(callObj,引数)と使う public function LoadAmazonXML(callFunc:Function,callObj:Object){ awsxml=new XML(); awsxml.ignoreWhite=true; awsxml.onLoad=function(success:Boolean){ if(success){ var rootNode=this.firstChild; callFunc.call(callObj,rootNode); }else{ trace("loaderror"); } } } //operationとparameterを引数にして、amazonECSに要求するURLをつくる。 public function makeURL(op:String,pr:Array):Void{ var myid:String="アクセスキーIDを入れる"; urlstr="http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=" +myid +"&&AssociateTag=macinbasic-22&Version=2005-10-05&Operation=" +op; switch(op){ case "BrowseNodeLookup": urlstr+="&BrowseNodeId=" +pr[0]; break; } } //urlstrを作成した後、ロードをかける。 public function load():Void{ awsxml.load(urlstr); } }
import classes.xml.*; import mx.controls.*; import mx.xpath.*; class ParseAmazonXML{ public static function getList(xmlnode:XMLNode,xpath:String):Array{ var temparray:Array=XPathAPI.selectNodeList(xmlnode,xpath); var returnarray:Array=new Array(); for(var i:Number=0;i<temparray.length;i++){ returnarray[i]=temparray[i].firstChild;//xmlnodeの配列をtextの配列に変換する } return returnarray; } }
コールバックファンクションの使い方は、この本で知りました。