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;
}
}
コールバックファンクションの使い方は、この本で知りました。