E4X による XML 処理

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

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

メモ

 

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 クラスについては詳しく説明しません。これらの詳細については、『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); // 出力: burger
trace(myXML.item.(@id==2).menuName); // 出力: fries
trace(myXML.item.(menuName=="burger").price); // 出力 : 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));

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000124.html