従来の ActionScript 2.0 でサポートされていた XML Class は XML Document と名前を変更し flash.xml package 内に移行され、ActionScript 3.0 からは XML データを処理するために、ECMAScript for XML (E4X) specification がサポートされた。
E4X とは ECMA-357 standard の ECMA International によって標準化された XML を処理する ECMAScript 拡張言語。このクラス導入により、Flash 内での XML parse 処理が格段に容易になっただけではなく、標準化された言語仕様に基づくことで、Javascript 等の他言語へのノウハウのバイパスがスムーズになりそう。

今回は、現在個人制作で Flickr を使った簡単ツールを作っているため、この制作過程のものをサンプルとして使用し、Zend Framework で Flickr API から取得した情報を XML 形式で書き出し、この XML を E4X で parse する様にする。
【サンプルファイル】
http://www.convexstyle.net/samplefiles/E4X/test.xml
http://www.convexstyle.net/samplefiles/E4X/E4X.zip
stop();// パッケージ化された外部クラスファイルの読み込み
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.xml.XML;
import flash.events.*;
import flash.error.*;// 初期設定
var targetURL:String = "http://www.convexstyle.net/samplefiles/E4X/test.xml";
var xml_obj:XML;// XML ファイル読み込み
var ULoader:URLLoader = new URLLoader();
ULoader.addEventListener(Event.COMPLETE, completeHandler);var URequest:URLRequest = new URLRequest();
URequest.url = targetURL;ULoader.load(URequest);
function parseXML(xml:XML):void {
var node_total:Number = xml..item.length();
var i:uint;
for(i = 0; i < node_total; i ++) {
trace("--------------------------------------");
trace("increment number: " + i);
trace("photoID: " + xml..item[i].info.@photoID);
trace("secretID: " + xml..item[i].info.@secretID);
trace("serverID: " + xml..item[i].info.@serverID);
trace("userID: " + xml..item[i].info.@userID);
trace("thumbnail url: " + xml..item[i].thumbnail.@url);
trace("width: " + xml..item[i].thumbnail.@width);
trace("height: " + xml..item[i].thumbnail.@height);
}
}// イベントハンドラ設定
function completeHandler(event:Event):void {
try {
xml_obj = new XML(ULoader.data);
parseXML(xml_obj);
} catch (e:Error) {
trace("XML Error 発生: " + e.toString());
}
}
XML のロードには、URLLoader と URLRequest クラスを使う。
URLLoader クラスに addEventLister で、ロードが完了で生じるイベントハンドラ(Event.COMPLETE)を設定し、その関数内で URLLoader の data property を parse することで XML の解析を行う。
ココからは E4X の本領発揮。
xml..item
item という全ノードを取得する。
xml..item.length()
item というノードの総数を取得
xml..item[0].info.@photoID
item というノードすべての中で、1番目のノードを取得し、その子ノード(info)と属性の1つである photoID の値を取得
今回はノード内の値は存在しない為取得していないが、text() 関数によって簡単にノード内の値を取得できる。
(例)xml..item[0].info.text()
また下記の様に、属性を比較して値を取得する事も可能だ。
(例)xml..item.(@id=="1").info.text()
以上、コレまでよりも XML の解析が非常にスムーズになっている。











