移動 XML 結構

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

XML 的其中一項強大功能,就是可透過文字字元的線性字串,提供複雜的巢狀結構資料。當您將資料載入 XML 物件中,ActionScript 就會剖析這項資料,並將其階層架構載入至記憶體中 (如果此 XML 資料並非制式格式,則會傳送執行階段錯誤)。

XML 和 XMLList 物件的運算子與方法可讓移動 XML 資料架構的工作變得輕鬆容易。

您可以使用點 (.) 運算子及後代存取子 (..) 運算子來存取 XML 物件的子屬性。以下列 XML 物件為例:

var myXML:XML =  
    <order> 
        <book ISBN="0942407296"> 
            <title>Baking Extravagant Pastries with Kumquats</title> 
            <author> 
                <lastName>Contino</lastName> 
                <firstName>Chuck</firstName> 
            </author> 
            <pageCount>238</pageCount> 
        </book> 
        <book ISBN="0865436401"> 
            <title>Emu Care and Breeding</title> 
            <editor> 
                <lastName>Case</lastName> 
                <firstName>Justin</firstName> 
            </editor> 
            <pageCount>115</pageCount> 
        </book> 
    </order>

myXML.book 物件是其中包含 myXML 物件之子屬性 (名為 book) 的 XMLList 物件。有兩個 XML 物件,而且這兩個物件符合 myXML 物件的兩個 book 屬性。

myXML..lastName 物件是包含所有名為 lastName 之後代屬性的 XMLList 物件。有兩個 XML 物件,而且這兩個物件符合 myXML 物件的兩個 lastName

myXML.book.editor.lastName 物件是包含 myXML 物件之所有曾孫系 (名為 lastName) 的 XMLList 物件 (其中子系名為 book 且孫系名為 editor):在此範例中,則是只包含一個 XML 物件 (值為「Case」的 lastName 屬性) 的 XMLList 物件。

存取父節點及子節點

parent() 方法會傳回 XML 物件的父輩。

您可以使用子清單的序數索引值,存取特定的子物件。例如,假設某個 XML 物件 myXML 包含兩個名為 book 的子屬性。每一個名為 book 的子屬性都具有與本身相關聯的索引編號:

myXML.book[0] 
myXML.book[1]

若要存取特定的孫系,您可以為子系與孫系名稱指定索引編號:

myXML.book[0].title[0]

然而,如果只有一個名為 title 的子系 x.book[0],您就可以省略此索引參考,如下所示:

myXML.book[0].title

同樣地,如果 x 物件只有一個 book 子系,而且這個子物件也只有一個 title 物件,您就可以省略這兩者的索引參考,如下所示:

myXML.book.title

您可以使用 child() 方法,瀏覽至根據變數或運算式所命名的子系,如下列範例所示:

var myXML:XML =  
        <order> 
            <book> 
                <title>Dictionary</title> 
            </book> 
        </order>; 
 
var childName:String = "book"; 
 
trace(myXML.child(childName).title) // output: Dictionary

存取特質

您可以使用 @ 符號 (特質識別名稱運算子),存取 XML 或 XMLList 物件中的特質,如下列程式碼中所示:

var employee:XML =  
    <employee id="6401" code="233"> 
        <lastName>Wu</lastName> 
        <firstName>Erin</firstName> 
    </employee>; 
trace(employee.@id); // 6401

您可以使用 * 萬用字元符號搭配 @ 符號,存取 XML 或 XMLList 物件中的所有特質,如下列程式碼中所示:

var employee:XML =  
    <employee id="6401" code="233"> 
        <lastName>Wu</lastName> 
        <firstName>Erin</firstName> 
    </employee>; 
trace(employee.@*.toXMLString());  
// 6401 
// 233

您可以使用 attribute()attributes() 方法,存取 XML 或 XMLList 物件的特定特質或所有特質,如下列程式碼中所示:

var employee:XML =  
    <employee id="6401" code="233"> 
        <lastName>Wu</lastName> 
        <firstName>Erin</firstName> 
    </employee>; 
trace(employee.attribute("id")); // 6401 
trace(employee.attribute("*").toXMLString());  
// 6401 
// 233 
trace(employee.attributes().toXMLString());  
// 6401 
// 233

請注意,您也可以使用下列語法來存取特質,如下列範例所示:

employee.attribute("id") 
employee["@id"] 
employee.@["id"]

這些每一個都是等同於 employee.@id 的語法。然而,employee.@id 則是慣用的語法。

藉由特質或元素值進行篩選

您可以使用括號運算子 (),篩選具有特定名稱或特質值的元素,以下列 XML 物件為例:

var x:XML =  
    <employeeList> 
        <employee id="347"> 
            <lastName>Zmed</lastName> 
            <firstName>Sue</firstName> 
            <position>Data analyst</position> 
        </employee> 
        <employee id="348"> 
            <lastName>McGee</lastName> 
            <firstName>Chuck</firstName> 
            <position>Jr. data analyst</position> 
        </employee> 
    </employeeList>

以下都是有效的運算式:

  • x.employee.(lastName == "McGee") — 這是第二個 employee 節點。

  • x.employee.(lastName == "McGee").firstName — 這是第二個 employee 節點的 firstName 屬性。

  • x.employee.(lastName == "McGee").@id — 這是第二個 employee 節點之 id 特質的值。

  • x.employee.(@id == 347) — 第一個 employee 節點。

  • x.employee.(@id == 347).lastName — 這是第一個 employee 節點的 lastName 屬性。

  • x.employee.(@id > 300) — 這是具有兩個 employee 屬性的 XMLList。

  • x.employee.(position.toString().search("analyst") > -1) — 這是具有兩個 position 屬性的 XMLList。

如果您嘗試篩選不存在的特質或元素,就會擲出例外。例如,下列程式碼的最後一行會產生錯誤,因為第二個 p 元素中並沒有 id 特質:

var doc:XML =  
            <body> 
                <p id='123'>Hello, <b>Bob</b>.</p> 
                <p>Hello.</p> 
            </body>; 
trace(doc.p.(@id == '123'));

同樣地,下列程式碼的最後一行也會產生錯誤,因為第二個 p 元素中並沒有 b 屬性:

var doc:XML =  
            <body> 
                <p id='123'>Hello, <b>Bob</b>.</p> 
                <p>Hello.</p> 
            </body>; 
trace(doc.p.(b == 'Bob'));

若要避免這些錯誤發生,您可以使用 attribute()elements() 方法,辨識具有相符特質或元素的特質,如下列程式碼中所示:

var doc:XML =  
            <body> 
                <p id='123'>Hello, <b>Bob</b>.</p> 
                <p>Hello.</p> 
            </body>; 
trace(doc.p.(attribute('id') == '123')); 
trace(doc.p.(elements('b') == 'Bob'));

您也可以使用 hasOwnProperty() 方法,如下列程式碼中所示:

var doc:XML =  
            <body> 
                <p id='123'>Hello, <b>Bob</b>.</p> 
                <p>Hello.</p> 
            </body>; 
trace(doc.p.(hasOwnProperty('@id') && @id == '123')); 
trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));

使用 for..in 和 for each..in 陳述式

ActionScript 3.0 包含 for..in 陳述式和 for each..in 陳述式,可用來重複執行 XMLList 物件。例如,以下列 XML 物件 myXML 以及 XMLList 物件 myXML.item 為例:XMLList 物件 myXML.item 由 XML 物件的兩個 item 節點組成。

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

for..in 陳述式可讓您重複執行 XMLList 中的一組屬性名稱:

var total:Number = 0; 
for (var pname:String in myXML.item) 
{ 
    total += myXML.item.@quantity[pname] * myXML.item.price[pname]; 
}

for each..in 陳述式可讓您重複執行 XMLList 中的屬性:

var total2:Number = 0; 
for each (var prop:XML in myXML.item) 
{ 
    total2 += prop.@quantity * prop.price; 
}