AS2.0では、XML、XMLNodeとXPathを使って、以下のような感じで必要なデータを抽出していました。
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; } }
※Xpathを使用するにはDataBindingClassesをライブラリに入れておく必要がある。
AS3.0からは、必要なPackageは主に以下の2つ。
import flash.events.*; import flash.net.*;
目的のXMLのノードまでたどり着く手順の概略は以下。
1.URLLoaderでXMLデータをダウンロードする。
2.ダウンロードしたデータはURLoader.dataプロパティに格納されるので、それをXMLに変換する。
3.XML.child("nodename")メソッドで必要なデータを抽出。リターンはXMLLsit形式で、該当する全てのノードを返してくれる。
http://livedocs.macromedia.com/flex/2/langref/index.html参照。
URLLoaderのインスタンスをリスナーするハンドラは以下のようになる。
public function dispData(eventObj:Event):void{ var xml:XML=XML(eventObj.target.data); var qname:QName=new QName(xml.namespace().uri,"BrowseNodes"); var qn2:QName=new QName(xml.namespace().uri,"Request"); trace(xml.child(qname).child(qn2)); }
AS3.0のXMLクラスは、変換と同時にフラッシュのDOMと対応するようになっているので、基本的に
<a> <b /> </a>
というXMLデータをXMLクラスに変換した場合、
a.b
でbのノードにアクセスできる。
汎用的なデータ抽出メソッドを定義する場合に、ストリングでノードを指定したいときには、
a.child("b");
となる。
少々注意しなければならないのは、AmazoonECSでは、nameスペースがノード全体に対して与えられているので、
a.children().name();
とやって参照するとわかると思うが、ノードの名前は、
uri::b
という形になっている。
uri::bはQNameというクラスのインスタンスとして実現されているので、ストリングで
a.child("uri::b");
とやってもだめで、
var qname:QName=new QName(uri,nodename);
a.child(qname);
としなければならない。
XMLがDOMになっているため、
XML.child("a").child("b").child("c");
のようなストリングの参照で、該当する全てのノードをリスト形式で抽出できるのでXPathは不要になる。
もうちょっとうまい使い方があるはずだと思うのでもう少し考えるが、確かに便利になっているかもしれない。