XML 処理の E4X アプローチ

Flash Player 9 以降、Adobe AIR 1.0 以降

ECMAScript for XML 仕様には、XML データを処理するためのクラス群や機能が定義されています。 これらのクラスは総称して E4X と呼ばれています。ActionScript 3.0 は、E4X 準拠のクラスとして、XML、XMLList、QName、および Namespace を備えています。

E4X クラスのメソッド、プロパティ、演算子についての策定作業では、次の特徴を実現することが目標とされました。

  • 簡易であること : E4X では、XML データを処理するコードをできるだけ簡単に作成および解読できるようになっています。

  • 一貫性があること : E4X で採用されているメソッドや考え方は、E4X それ自体の中で首尾一貫しており、また、ActionScript の他の部分とも一貫性があります。

  • なじみやすいこと:XML データの操作には、よく知られているドット( . )などの演算子を使用します。

注意: ActionScript 2.0 には別の XML クラスがあります。E4X 仕様の一部である ActionScript 3.0 XML クラスと競合しないように、ActionScript 3.0 では XMLDocument というクラス名に変更されました。XMLDocument、XMLNode、XMLParser、XMLTag の各クラスは、ActionScript 3.0 では、主にレガシー機能のサポートを目的として flash.xml パッケージに含まれています。E4X の新しいクラスはコアクラスなので、使用の際にパッケージを読み込む必要はありません。 ActionScript 2.0 のレガシー XML クラスについて詳しくは、『 Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド 』の flash.xml パッケージ の項を参照してください。

E4X を使用したデータ処理の例を次に示します。

var myXML:XML =  
    <order> 
        <item id='1'> 
            <menuName>burger</menuName> 
            <price>3.95</price> 
        </item> 
        <item id='2'> 
            <menuName>fries</menuName> 
            <price>1.45</price> 
        </item> 
    </order>

XML データは、実際のアプリケーションでは Web サービスや RSS フィードなどの外部ソースからロードすることが多いと考えられますが、 ここでは、例を単純にするために XML データをリテラルで割り当てます。

次のコードに示すとおり、E4X には、XML のプロパティや属性へのアクセスに使用するドット( . )や属性識別用の接頭辞( @ )などのわかりやすい演算子が用意されています。

trace(myXML.item[0].menuName); // Output: burger 
trace(myXML.item.(@id==2).menuName); // Output: fries 
trace(myXML.item.(menuName=="burger").price); // Output: 3.95

XML のノードに新しい子ノードを割り当てるには、次のように appendChild() メソッドを使用します。

var newItem:XML =  
    <item id="3"> 
        <menuName>medium cola</menuName> 
        <price>1.25</price> 
    </item> 
 
myXML.appendChild(newItem);

@ および . 演算子は、読み取りだけでなく、次のようにデータの割り当てにも使用できます。

myXML.item[0].menuName="regular burger"; 
myXML.item[1].menuName="small fries"; 
myXML.item[2].menuName="medium cola"; 
 
myXML.item.(menuName=="regular burger").@quantity = "2"; 
myXML.item.(menuName=="small fries").@quantity = "2"; 
myXML.item.(menuName=="medium cola").@quantity = "2";

次のように for ループを使用すると、XML の一連のノードに対する繰り返し処理ができます。

var total:Number = 0; 
for each (var property:XML in myXML.item) 
{ 
    var q:int = Number(property.@quantity); 
    var p:Number = Number(property.price); 
    var itemTotal:Number = q * p; 
    total += itemTotal; 
    trace(q + " " + property.menuName + " $" + itemTotal.toFixed(2)) 
} 
trace("Total: $", total.toFixed(2));