Actionsciprt 3 XML Sınıfı (E4X)
10 Kasım 2007 – 00:05Actionscript 3 içerisinde XML kütüphanesi köklü değişiklikler oldu.Şu anda ECMAScript for XML (E4X) denen bir sistem kullanıyor, ve kullanımı Actionscript 2 ye göre daha da kolaylaştırıldı.Validating Parser ile xml dosyalarınızın hatalı olup olmadığını kontrol ediyor, yani tagların düzgün kapatılıp kapatılmadığını, dügümlerin eksik mi yada yanlış yerlerde olup olmadığını kontrol ediyor.Bu özellik ile aslında büyük bir yükün altından kalkıyoruz.
Bu makalede Xml in Actionscript 3 ile Flash ın içerisinde temel olarak nasıl kullanıldığını ve XML sınıfını kısaca anlatmaya çalışacağım.
Bu yazıda kullanacağımız örnek xml sayfası;
<?xml version=”1.0″ encoding=”utf-8″?>
<list>
<title>XML Test</title>
<link>http://www.stayupdatedonweb.com</link>
<item id=”001″>
<book >Şehir Mektupları</book>
<author> Ahmet Rasim </author>
</item>
<item id=”002″>
<book >Sınırlar Arasında</book>
<author>Banu Avar</author>
</item>
<item id=”003″>
<book >Yedek Parça</book>
<author>Aziz Nesin”</author>
</item>
</list>
İlk olarak bir xml dökümanını Flashın içerisine nasıl yüklenebileceğini anlatacağım .Flashın dışında bulunan bir xml flasha yüklemek için URLLoader sınıfını kullanılıyor.
-
//Kullandığımız Türkçe karakterlerin doğru olarak görüntülenmesi için useCodePage özelliğini kullanıyoruz.
-
System.useCodePage = true;
-
//İlk olarak yeni bir xml tanımlıyoruz.
-
var myXML:XML = new XML();
-
//URLRequest
-
var myXMLURL:URLRequest = new URLRequest("test.xml");
-
//URLLoader
-
var myLoader:URLLoader = new URLLoader(myXMLURL);
-
//EventLİsterner ekliyoruz
-
myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
-
//Yüklendiğinde çalışacak olan Fonksiyon
-
function xmlLoaded(event:Event):void {
-
//myLoader daki bilgiyi alip xml le yüklüyor
-
myXML = XML(myLoader.data);
-
//XML yüklenen bilginin tamamının trace metodu ile çıktısını alıyoruz
-
trace(myXML);//Tamamı
-
}
XMl i başarılı bir şekilde yüklediğimize göre xml i ayrıştırmaya geçebiliriz.Aşağıda vereceğim kodları xmlLoaded fonksiyonu içerisinde trace ederek sonuça ulaşabilirsiniz.
XMl de bir ilk düğümün altında duran bir tagın içindeki bilgiyi almak için tek yapmanız gereken belirttiğiniz xml objesi ve tagın adını yazmak.
-
trace(myXML.title) // XML Test
-
trace(myXML.link) // http://www.stayupdatedonweb.com
Buradaki sıra tamamen önemli değil yani eğer ilk düğümdeki title tagı xml’in sonunda da olsa başında da olsa aynı metodla ulaşabilirsiniz.
Peki eğer bir tag birden fazla sefer mevcutsa.Mesela kullandığımız örnek xml de 3 tane item tagı var, bu tagları almak için aynı metodu kullanacağız, ama bu bize tüm item taglarını verecektir.Belli bir tagı almak için ise item tagından sonra sıra numarası belirtmemiz gerekecek.Sıra numaraları tabii sıfır(0) dan başlayacaktır.
-
trace(myXML.item)
-
trace(myXML.item[0])
İstediğimiz Item tagını aldık, sırada ise item tagının içindeki book ve author taglarına ulaşmak.Bunun için ise item tagından sonra çağırmak istediğimiz tagı çağıracagız.
-
trace(myXML.item[0].book) //Şehir Mektupları
-
trace(myXML.item[0].author) //Ahmet Rasim
Şu ana kadar çektiğimiz tüm bilgiler taglar arasındaki bilgilerdi, peki herhangi bir attribute (öznitelik diye geçiyor sözlükte) nasıl çağırabiliz.Oda çok basit tabiki.Item tagından sonra @ işareti koyarak attribute adını yazmamız yeterli.item tagının attribute almak için
-
trace(myXML.item[0].@id) // 001
Attribute lerin tamamına ulaşmak isterseniz yapmanız gereken @ işaretinden sonra * işareti koymaktır.Bu size belirttiğiniz düğümdeki tüm attributeleri verecektir.
-
trace(myXML.item.@*)
Ayrıca xml den bilgi alırken bu bilgileri filtreleyebiliyoruz.Mesela ismini bildiğiniz bir yazarın kitabını aratmak gibi.Bunun için ise tabii eşleştireceğiniz daha doğrusu filtreleyeğiniz bilginin bilinmesi gerekiyor.Düğümün tamamına ulaşmak için kullanacağınız metod;
-
myXML.item.(author == "Banu Avar");
Sadece kitap ismini istiyorsak eğer book tagını kodun sonuna ekleyerek ulaşabiliriz.
-
myXML.item.(author == "Banu Avar").book; //Sınırlar Arasında
Aynı yöntemle item id numarasınada ulaşabiliriz.Tabii id numarası attribute olduğundan dolayı @ işareti kullanmanız gerekiyor.
-
trace(myXML.item.(author == "Banu Avar").@id) //002
Filtreleme yöntemi için ihtiyaç duyduğunuz bilgi çeşidi ve xml inize göre düzenleyebilirsiniz.Ben sadece iki örenek daha verip filtreleme kısmını geçeceğim.
-
myXML.item.(@id == 001); // ikinci düğümün tamamını size verecektir.
-
myXML.item.(@id > 002); //iki den küçük olan tüm id lerin düğümünü size verecektir.
Sırada ise length özelliği var .length() ile xml in içindeki belli bir düğümünün sayısına yada element sayısına ulaşabilirsiniz.Aşağıdaki kod ile item düğümünün toplam saysını ulaşabilirsiniz.
-
trace(myXML.item.length()); //item uzunluğu
Şimdiye kadar yukarıda vurguladım metodlar ve teknikler xml ayrıştırmanıza yardımcı olacak derecedir.Tabii bunların yanısıra farklı kod kombinasyonları kullanılabilir.
Mesela;
-
trace(myXML.item.length()); //item uzunluğu
-
trace(myXML.child("item").length()); // item uzunluğu
-
trace(myXML.item); //item tamamı
-
trace(myXML.child("item"));//item tamamı
yukarıdaki kodlar tamamen aynı sonucu döndürecektir,tabiki kullanım tercihiniz tamamen size aittir.
Kısacası actionscript 3 xml çözümleme yönünden eskisine göre şu anda daha güçlü ve kolay bir yapıya sahip.
Kaynak Kodlar
Kolay Gelsin…
Engin!

3 Responses to “Actionsciprt 3 XML Sınıfı (E4X)”
hocam bu “length ()” özelliğindeki () parantezler ne işe yarıyor xml yuklerken ve diğer bazı uygulamalarda aradaki farkı anlamak için parantez koydum hata verdi.. bazen parantezler kullanılmıyor bu özellikle birlikte sebebi nedir acaba… f1 ile çözülebilcek gibi değil…
By emrah atılkan on Tem 1, 2008
Merhaba Emrah,
ilk olarak F1 i kullandığına sevindim, genelde kimse bakmıyorda. Şimdi lenght olayını izah edim. Flash içerisindeki sınıf yapılarının XML harici diğerlerinde lenght için herhangi bir parantez işareti kullanmazsın. Mesela bir string değerinin uzunluğu öğrenmek istiyorsa;
var a:String = new String(”Test”);
trace(a.length);
Yukarıdaki kodda çıkacak olan sonuç 4 olacak. Dikkat ettiysen buradai length için herhangi bir paranztez eklenmedi. Bu Arraylar içinde geçerli.
Esas soru şu aslında neden XML de parantez işaretleri kullanıyoruz?
Cevap ise basit, XML deki bir metot, diğerleri ise birer özellik. Actionscrpt içerisine metotları kullanırken parantez açıp kapamak zorundasın.Temel fonksiyon çağırmak gibi yani.
Umarım yardımcı olmuştur Emrah
Kolay gelsin
By Engin Yöyen on Tem 1, 2008
çok yardımı oldu kesinlikle
sayfanı takip edip elimden geldiğince az soru sormaya özen göstereceğim ama kafamda o kadar çok soru varki bir an önce kitabının çıkışını bekliyorum… teşekürler..
By emrah atılkan on Tem 1, 2008