XML 処理の E4X アプローチFlash Player 9 以降、Adobe AIR 1.0 以降 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 クラスについて詳しくは、『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)); |
![]() |