XML yapılarında geçiş yapma

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

XML'in güçlü özelliklerinden biri, doğrusal metin karakterleri dizesi yoluyla karmaşık, yuvalanmış veriler sağlama yeteneğidir. Bir XML nesnesine veri yüklediğinizde, ActionScript veriyi ayrıştırır ve verinin hiyerarşik yapısını belleğe gönderir (veya XML verisi düzgün biçimlendirilmemişse bir çalışma zamanı hatası gönderir).

XML ve XMLList nesnelerinin operatörleri ve yöntemleri, XML verilerinde geçiş yapılmasını kolaylaştırır.

Bir XML nesnesinin alt özelliklerine erişmek için, nokta (.) operatörünü ve alt öğe erişimcisi (..) operatörünü kullanın. Şu XML nesnesini göz önünde bulundurun:

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 nesnesi, myXML nesnesinin, book adına sahip olan alt özelliklerini içeren bir XMLList nesnesidir. Bunlar, myXML nesnesinin iki book özelliğiyle eşleşen iki XML nesnesidir.

myXML..lastName nesnesi, lastName adına sahip olan tüm alt öğe özelliklerini içeren bir XMLList nesnesidir. Bunlar, myXML nesnesinin iki lastName özelliğiyle eşleşen iki XML nesnesidir.

myXML.book.editor.lastName nesnesi, myXML nesnesinin book adına sahip alt öğelerinin editor adına sahip alt öğelerinin lastName adına sahip herhangi bir alt öğesini içeren XMLList nesnesidir: bu durumda, yalnızca bir XML nesnesi içeren bir XMLList nesnesidir ("Case" değerine sahip lastName özelliği).

Üst ve alt düğümlere erişme

parent() yöntemi, XML nesnesinin üst öğesini döndürür.

Belirli alt nesnelere erişmek için, bir alt öğe listesinin sıra belirten dizin değerlerini kullanabilirsiniz. Örneğin, book adına sahip iki alt özellik içeren bir myXML XML nesnesini göz önünde bulundurun. book olarak adlandırılan her alt özellik, bununla ilişkilendirilmiş bir dizin sayısına sahiptir:

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

Belirli bir alt alt öğeye erişmek için, hem alt öğe hem de alt alt öğe adları için dizin sayıları belirtebilirsiniz:

myXML.book[0].title[0]

Ancak, x.book[0] öğesinin, title başlık adına sahip yalnızca bir alt öğesi varsa, şu şekilde dizin başvurusunu çıkarabilirsiniz:

myXML.book[0].title

Aynı şekilde, x nesnesinin yalnızca bir kitap alt öğesi varsa ve bu alt nesne yalnızca bir başlık nesnesine sahipse, şu şekilde her iki dizin başvurusunu çıkarabilirsiniz:

myXML.book.title

Aşağıdaki örnekte gösterildiği gibi, bir değişken veya ifadeyi esas alan adlara sahip alt öğelere gitmek için child() yöntemini kullanabilirsiniz:

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

Niteliklere erişme

Aşağıdaki kodda gösterildiği gibi, bir XML veya XMLList nesnesindeki niteliklere erişmek için @ sembolünü (nitelik tanımlayıcısı operatörü) kullanın:

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

Aşağıdaki kodda gösterildiği gibi, bir XML veya XMLList nesnesinin tüm niteliklerine erişmek için, @ sembolüyle birlikte * joker karakter sembolünü kullanabilirsiniz:

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

Aşağıdaki kodda olduğu gibi, bir XML veya XMLList nesnesinin belirli bir niteliğine veya tüm niteliklerine erişmek için, attribute() ya da attributes() yöntemini kullanabilirsiniz:

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

Aşağıdaki örnekte gösterildiği gibi, niteliklere erişmek için şu sözdizimini de kullanabildiğinizi unutmayın:

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

Bunların her biri şuna eşdeğerdir: employee.@id. Ancak tercih edilen yaklaşım, employee.@id sözdizimidir.

Niteliğe veya öğe değerine göre filtre uygulama

Belirli bir öğe adına veya nitelik değerine sahip öğelere filtre uygulamak için, parantez operatörlerini— ( ve ) —kullanabilirsiniz. Şu XML nesnesini göz önünde bulundurun:

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>

Aşağıdaki ifadelerin tümü geçerlidir:

  • x.employee.(lastName == "McGee")—Bu, ikinci employee düğümüdür.

  • x.employee.(lastName == "McGee").firstName—Bu, ikinci employee düğümünün firstName özelliğidir.

  • x.employee.(lastName == "McGee").@id—Bu, ikinci employee düğümünün id niteliğidir.

  • x.employee.(@id == 347)—Birinci employee düğümü.

  • x.employee.(@id == 347).lastName—Bu, birinci employee düğümünün lastName özelliğidir.

  • x.employee.(@id > 300)—Bu, her iki employee özelliğini içeren bir XMLList öğesidir.

  • x.employee.(position.toString().search("analyst") > -1)—Bu, her iki position özelliğini içeren bir XMLList öğesidir.

Var olmayan nitelikler veya öğeleri filtrelemeye çalışırsanız, bir istisna atılır. Örneğin, ikinci p öğesinde id niteliği bulunmadığından, aşağıdaki kodun son satırı bir hata oluşturur:

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

Aynı şekilde, ikinci p öğesinin b özelliği bulunmadığından, aşağıdaki kodun son satırı bir hata oluşturur:

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

Bu hataları önlemek için, aşağıdaki kodda olduğu gibi, attribute() ve elements() yöntemlerini kullanarak, eşleşen niteliklere veya öğelere sahip özellikleri tanımlayabilirsiniz:

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

Ayrıca aşağıdaki kodda olduğu gibi, hasOwnProperty() yöntemini de kullanabilirsiniz:

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 ve for each..in deyimlerini kullanma

ActionScript 3.0, XMLList nesnelerinin yinelenmesi için for..in deyimini ve for each..in deyimini içerir. Örneğin, şu myXML XML nesnesini ve myXML.item XMLList nesnesini göz önünde bulundurun. myXML.item XMLList nesnesi, XML nesnesinin iki item düğümünü içerir.

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 deyimi, bir XMLList öğesindeki özellik adları kümesini yinelemenize olanak sağlar:

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

for each..in deyimi, XMLList öğesindeki özellikleri yinelemenize olanak sağlar:

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