用來處理 XML 的 E4X

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

ECMAScript for XML 規格定義了一組類別與功能,可供您用來使用 XML 資料。這些類別與功能統稱為 E4X。ActionScript 3.0 包含下列 E4X 類別:XML、XMLList、QName 和 Namespace。

E4X 類別的各項方法、屬性與運算子都是針對下列目標而設計:

  • 簡易性 — 在使用 XML 資料時,E4X 可讓撰寫及閱讀程式碼變得更加容易。

  • 一致性 — E4X 的方式與思考是要達到內部的一致性,也同時要能與 ActionScript 的其它部分一致。

  • 熟悉度 — 您可以使用眾所周知的運算子來處理 XML 資料,例如點 (.) 運算子。

備註: 在 ActionScript 2.0 中是不同的 XML 類別;而在 ActionScript 3.0 中,這個類別已經重新命名為 XMLDocument,以免名稱與屬於 E4X 的 ActionScript 3.0 XML 類別發生衝突。在 ActionScript 3.0 中,從先前版本遺留下來的 XMLDocument、XMLNode、XMLParser 以及 XMLTag 類別都會包含在 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>

您的應用程式經常會從外部來源 (例如網路服務或是 RSS Feed) 載入 XML 資料。不過,為了清楚起見,此處提供的程式碼範例會將 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

您可以使用 appendChild() 方法,將新的子節點指定給 XML,如下列程式碼片段所示:

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));