Gå igenom XML-strukturer

Flash Player 9 och senare, Adobe AIR 1.0 och senare

I XML finns en kraftfull funktion för att skapa komplexa, kapslade data via en linjär sträng med tecken. När du läser in data i ett XML-objekt, tolkas dessa data i ActionScript och läses sedan in i dess hierarkiska struktur i minnet (eller så skickas ett körningsfel om aktuella XML-data inte var väl utformade).

Operatorerna och metoderna i XML- och XMLList-objekten gör det enkelt att gå igenom strukturen med XML-data.

Använd punktoperatorn (.) och dubbelpunktsoperatorn (..) för att få åtkomst till underordnade egenskaper i ett XML-objekt. Se följande XML-objekt:

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>

Objektet myXML.book är ett XMLList-objekt som innehåller underordnade egenskaper till myXML-objekt med namnet book. Detta är två XML-objekt, som matchar två book-egenskaper av myXML-objektet.

Objektet myXML..lastName är ett XMLList-objekt som innehåller egenskaper för dubbelpunktsoperatorn med namnet lastName. Detta är två XML-objekt, som matchar två lastName av myXML-objektet.

Objektet myXML.book.editor.lastName är ett XMLList-objekt som innehåller underordnade objekt med namnet lastName som är underordnat ett med namnet editor som i sin tur är underordnat ett med namnet book i objektet myXML: i detta finns ett XMLList-objekt som bara innehåller ett XML-objekt (egenskapen lastName med värdet ”Case”).

Åtkomst till överordnade och underordnade noder

Metoden parent() returnerar det överordnade objektet till ett XML-objekt.

Du använder heltalsindexvärdet för en underordnad lista för att få åtkomst till ett specifikt underordnat objekt. Ett XML-objekt av typen myXML, kan exempelvis ha två underordnade egenskaper med namnet book. Varje underordnad egenskap med namnet book har ett associerat indexvärde:

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

Om du vill få åtkomst till en indirekt underordnad egenskap anger du ett specifikt indexvärde för namnen både på den underordnade och på den indirekt underordnade egenskapen, enligt följande:

myXML.book[0].title[0]

Om du emellertid endast har en underordnad till x.book[0] med namnet title, kan du utelämna indexreferensen enligt följande:

myXML.book[0].title

Om det på liknande sätt bara finns en underordnad ”book” till objektet x, och om detta underordnade objekt endast har ett titelobjekt, kan du utelämna båda indexreferenserna, enligt följande:

myXML.book.title

Du använder metoden child() för att med hjälp av namnen navigera till det underordnade objektet utifrån en variabel eller ett uttryck, vilket visas i nästa exempel:

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

Hämta attribut

Symbolen @ (attributidentifieraroperatorn) använder du för att hämta attribut i ett XML- eller XMLList-objekt, vilket visas i nästa exempel:

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

Om du använder jokertecknet * tillsammans med symbolen @ kan du hämta alla attribut i ett XML- eller XMLList-objekt, vilket framgår av följande exempel:

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

Med metoderna attribute() eller attributes() kan du hämta ett specifikt attribut eller alla attribut i ett XML- eller XMLList-objekt, vilket visas i exemplet nedan:

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

Tänk på att du också kan använda följande syntax för att hämta attribut:

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

Dessa båda är likvärdiga med employee.@id. Syntaxen employee.@id är däremot att föredra.

Filtrera med attribut eller elementvärden

Du kan använda parentesoperatorer – ( och ) – för att filtrera element med hjälp av ett specifikt elementnamn eller attributvärde. Se följande XML-objekt:

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>

Följande uttryck är alla giltiga:

  • x.employee.(lastName == "McGee") – Detta är den andra employee-noden.

  • x.employee.(lastName == "McGee").firstName – Detta är egenskapen firstName för den andra employee-noden.

  • x.employee.(lastName == "McGee").@id – Detta är värdet på attributet id för den andra employee-noden.

  • x.employee.(@id == 347) – Den första employee-noden.

  • x.employee.(@id == 347).lastName – Detta är egenskapen lastName för den första employee-noden.

  • x.employee.(@id > 300) – Detta är en XMLList med båda employee-egenskaperna.

  • x.employee.(position.toString().search("analyst") > -1) – Detta är en XMLList med båda position-egenskaperna.

Om du försöker filtrera attribut eller element som inte finns inträffar ett undantag. På den sista raden i exemplet nedan genererar följande kod ett fel eftersom det inte finns något id-attribut i det andra p-elementet:

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

Detsamma gäller för den sista raden i exemplet nedan där följande kod leder till ett fel eftersom det inte finns någon b-egenskap i det andra p-elementet.

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

Du kan undvika dessa fel genom att använda metoderna attribute() och elements() för att identifiera matchande egenskaper, enligt följande exempel:

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

Du kan också använda metoden hasOwnProperty() som i följande exempel:

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

Använda for..in- och for each..in-satserna

ActionScript 3.0 innehåller programsatserna for..in och for each..in som du använder för att iterera igenom XMLList-objekt. Ett XML-objekt, myXML och XMLList-objektet, myXML.item. XMLList-objektet myXML.item, består av två item-noder av XML-objektet.

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

Slingan for..in itererar du igenom en uppsättning egenskapsnamn i en XMLList:

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

Slingan for each..in gör att du kan iterera igenom egenskaperna i XMLList:

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