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