Flash + ActionScript kullanarak XML dosyasından veri çekmek

Bu konuyu okuyanlar

Efe Zoroğlu

Müdavim
Katılım
24 Mayıs 2007
Mesajlar
1,274
Reaksiyon puanı
7
Puanları
0
Öncelikle XML sayfamızı oluşturalım.ve icerik.xml olarak kaydelim.
<xml>
<icerik>
<item>
<baslik>Baslik-1</baslik>
<detay>Detay-1!</detay>
</item>
<item>
<baslik>Baslik-2</baslik>
<detay>Detay-2!</detay>
</item>
<item>
<baslik>Baslik-3</baslik>
<detay>Detay-3!</detay>
</item>
<item>
<baslik>Baslik-4</baslik>
<detay>Detay-4!</detay>
</item>
<item>
<baslik>Baslik-5</baslik>
<detay>Detay-5!</detay>
</item>
</icerik>
</xml>


XML dosyamızın yapısı bu şekilde.

Şimdi yeni bir Flash çalışma sayfası açalım.Sayfamıza bir adet TextArea ve 2 adet Buton Componenti ekleyelim.isimledirmeyi(instance name) ise şu sekilde yapalim.

TextArea=>icerik_txt
Button1=>ileri , label etiketine “İleri “ yazalım.
Button2=>geri,label etiketi olarak “Geri” yazalım.



Yapmak istediğimiz şey XML dosyamızda bulunan bilgileri sırasıyla çekmek ve “ileri” ve “Geri” butonlarını kullanarak verilerimizin hepsini değil sırayla textArea componentinde göstermek olacak

Şimdi ana ekranda frame1 i tıklayıp Action panelini açalım ve aşağıdaki kodları yazalım.

//Türkçe karakterlerde sorun yaşamamak için useCodepage=”true” yaptık.
System.useCodepage=true;
//yeni bir XML sınıfı oluşturduk ve adını myxml yaptık.
var myxml:XML=new XML();
//XML verilerini çekerken bilgisayarın boşluk,enter,tab gibi karakterleri görmemesi ve
//daha //kolay okuması için ignoreWhite=”true” yaptık.
myxml.ignoreWhite=true;
//icerik.xml sayfamızı yükledik.
myxml.load("icerik.xml");
//buradaki onLoad olayı xml dosyası myxml değişkenimize tamamen yüklenince //tetiklenecektir.burada “ok” adında bir değişken yazdık.bu değişken boolean
//tanımlanmış
//bir değişken olarak görebilirsiniz.eğer XML dosyamız tamamiyle
//yüklendiğinde “ok”
//değişkenimiz “true” değer alır.Böylece fonksiyon içindeki if
//döngüsüne girilir.
myxml.onLoad=function(ok)
{
if(ok)
{

//Xml döngümüz içindeki alacağımız verilerin sayısını alıyoruz.Xml dosyamıza
//baktığınızda “<item></item>” etiketleri arasındaki değerler çekilecek.Burada “no” //değişkenimizi “_global” tanımlıyoruz ki diğer fonksiyonlarda da kullanabilelim.aynı
//şekilde “sayfa” değişkenimizde.Aşağıdaki “childNodes” kodlarını ise aşağıda daha net //anlatacağız.Burada ise sadece “<item>” etiketlerinini sayısını alıyoruz.O ad 5 tanedir.
_global.no=myxml.childNodes[0].childNodes[0].childNodes.length;
_global.sayfa=0;
duzenle(sayfa);
}
}

function duzenle(sayfa)
{
//Bu fonksiyonda ise çekilen verileri “icerik_txt” instance name li textArea componentine //yazdırıyoruz.”chr(13)” kodu enter anlamındadır.ve bir satır aşağıya iner.
_root.icerik_txt.text+=
"<baslik>"+
myxml.childNodes[0].childNodes[0].childNodes[sayfa].childNodes[0].childNodes[0]
+"</baslik>"+chr(13)+
"<detay>"+
myxml.childNodes[0].childNodes[0].childNodes[sayfa].childNodes[1].childNodes[0]
+"</detay>"+chr(13);

//Burada ise eğer son kayıt görünüyor ise “ileri” butonu pasif yapılıyor.
if(sayfa==no-1)
{
_root.ileri.enabled=false;
}
else
{
_root.ileri.enabled=true;
}
//Aynı şekilde ilk kayıtta isek “geri” butonu pasif ediliyor.
if(sayfa==0)
{
_root.geri.enabled=false;
}
else
{
_root.geri.enabled=true;
}
}
//İleri butonuna basıldığında “sayfa” değişkeimiz +1 artıyor ve sonraki veri gözüküyor.
ileri.onRelease=function()
{ sil();
sayfa+=1;
duzenle(sayfa);
}
//Geri butonuna basıldığında ise “sayfa” değişkeni –1 azaltılarak önceki veri gözüküyor.
geri.onRelease=function()
{
sil();
sayfa-=1;
duzenle(sayfa);
}
//Sil fonksiyonu ise veriler arasında geçişlerde “icerik_txt” textArea componentini //temizliyor ve yeni veri ekrana baslıyor.
function sil()
{
_root.icerik_txt.text="";
}

İşte kodlar bu kadar.şimdi ise XML dosyamızın içindeki verilere nasıl ulaşıldığından bahsedelim.Aşağıdaki xml yapımızı yukarıdan daha basit bi şekilde yazalım.

<item>
<baslik>Baslik-1</baslik>
<detay>Detay-1!</detay>
</item>

Arkadaşlar bildiginiz gibi XML verileri bir ağaç yapısındadır.ve ağaç dallarına ulaşmak için bazı kodlar kullanırız.Burada “firstchild” ve “childNodes” kodlarından bahsedeceğim.

Şimdi yukarıdaki xml yapısında “başlık-1” verisine ulaşmak şu şekildedir.

myxml.childNodes[0].childNodes[0].childNodes[0];
<item> <baslik> Başlık-1


şeklinde yazdırmaktayız.yani myxml sınıfımızın ilk çocuğu “<item>” etiketinin de ilk çoçuğu “<baslik>” etiketinin de ilk cocuğu olan “Başlık-1” verisi.

Kodların altında da neyi ifade ettikleri yazıyo.yani biz “Başlık-1“ yazdırmak için gördüğünüz bu kodu yazmaktayız.peki ya “Detay-1” yazdırmak istersek.

myxml.childNodes[0].childNodes[1].childNodes[0];
<item> <detay> Detay-1


şeklinde yazdırmaktayız.yani myxml sınıfımızın ilk çocuğu “<item>” etiketininde ikinci çoçuğu “<detay>” etiketininde ilk cocuğu olan “Detay-1” verisi.Burada “[0]” değerleri bildiğiniz gibi programlama dillerinde başlangıç indisidir.Bu birinci veri anlamındadır.”[1]” ise ikinci indis numarasıdır.

Gerçekten kafa karıştırıcı ama lütfen biraz kafa yoralım.Çünkü bu şekilde öğrenenbiliriz.
Peki arkadaşlar ilk xml yapısına dönelim ve zor olanda aynı işlemleri yapalım.

<xml>
<icerik>
<item>
<baslik>Baslik-1</baslik>
<detay>Detay-1!</detay>
</item>
</icerik>
</xml>

Burada “Başlık-1” verisini almamız için gereken kod nedir.

myxml.childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[0];
<xml> <icerik> <item> <baslik> Baslik-1


şeklindeki kodlarla “Başlık-1” verisini alabiliriz.
Peki ya. “Başlık-3” verisini almak istiyorsak.Xml sayfamız içindeki.

myxml.childNodes[0].childNodes[0].childNodes[2].childNodes[0].childNodes[0];
<xml> <icerik> <item> <baslik> Baslik-3

şeklindeki kodla alabiliriz.

Burada firstChild kodundan biraz bahsedelim. firstChild ,ChildNodes[0] ifadesinin yerini tutar.yani ilk çocuğun yerini tutar.childNodes[0] da ilk çocuğun yerini tutar.yani childNodes[0] gördügümüz yerlere firstChild yazabiliriz.

Yukarıdaki örneği kullanarak gösterelim.

myxml.firstChild. firstChild.childNodes[2]. firstChild. firstChild;
<xml> <icerik> <item> <baslik> Baslik-3



firstChild==childNodes[0] Doğrudur.
firstChild ==childNodes Yanlıştır.
firstChild ==childNodes[herhangi bir sayı] Yanlıştır.


Arkadaşlar gördüğünüz gibi biraz karışık.ama çalışılırsa yapılamıyacak bişey değil.XML parse etmeyi mutlaka öğrenmeliyiz arkadaşlar.çünkü XML dosaylarının hepsi aynı desende olamyacaklardır.Karşınıza gelen her farklı XML dosyası için farklı şekilde parse kodları yazmalısınız.Bunun da yolu öğrenmekten geçer.

Makalem hakkında soru ,eleştiri ve düşüncelerinizi bekliyorum.İnşaallah öğrenmenize bir nebzede olsa katkı sağlamışımdır.Lütfen çok fazla örnek yapın ve internette sürekli araştırın.Yazılımı sevin arkadaşlar çünkü sevmeden bişey çıkartamassınız.

Arkadaşlar ayrıca bu örneği içeren kaynak kodlarıda aşağıdan indirebilirsiniz.
Dosyaları indir.

Kadir Gülağız
http://www.kGlz.com
http://www.kGlz.110mb.com
Alıntı:Ceviz.net
 

akifsever

Asistan
Katılım
23 Ocak 2006
Mesajlar
180
Reaksiyon puanı
0
Puanları
0
Flash aslında çok yetenekli bir araç her sistemde çalışması büyük bir avantaj XML de her sistemde kullanılıyor.

Ama şu veri işleme ,okuma konusunda biraz yetersiz. Aslında yeterlide en iyi kullandığı XML kapalı bir sistem değil xmli herkez görebiliyor. ASP veya PHP nin kullandığı veri tabanlarını kendi özellikleri ile yapsa daha iyi olur.

Flash ile MS access , sql server veya mysqle veri yazması okumasını yapabiliyor ama ASP veya PHP kullanması gerekiyor.

burda çok iyi anlatılmış http://www.kirupa.com/developer/actionscript/forms_database.htm
 
Üst