BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Çetrefil İletişim
 

XML BELGELERİ İLE ÇALIŞMAK

Paylaşılabilen ve anlamlandırılabilen yetenekli XML belgeleri, Microsoft’un MSXML paketi ile çok kolay yönetiliyor. XMLHTTP ile Internet’ten XML belgesi ya da herhangi bir dosya yükleyin. DOMDocument ile belgeleri okuyun ve işleyin. XML belgelerini bilgisayarınıza kaydedin.

XML BELGELERİNİ TANIYIN

XML belgeleri öncelikle tanımlayıcı bir ilk satırdan ve bir kök elementten (root-element) oluşur. Her XML belgesinde mutlaka ve yalnızca bir kök element vardır.

Örneğin kitap bilgilerinin listelendiği bir belgede bu, KITAPLAR isminde olabilir. Bunun altında KITAP adlı alt elementler (child-element) yer alabilir. Her bir elementin altında birçok seviyede alt element olabilir.

<?xml version='1.0'?>

<KITAPLAR>
   <KITAP>
      <KITAPADI>Stratejik İttifak</KITAPADI>
      <YAZAR>Alptekin Dursunoğlu</YAZAR>
      <YAYINEVI>Anka</YAYINEVI>
   </KITAP>
   <KITAP>
      <KITAPADI>Kılıç Yarası Gibi</KITAPADI>
      <YAZAR>Ahmet Altan</YAZAR>
      <YAYINEVI>Can</YAYINEVI>
   </KITAP>
</KITAPLAR>

XML belgeleri açık ve okunaklı bir yapıda olduğundan, bunları düzenlemek için özel bir editöre ihtiyaç yoktur. Windows’taki Not Defteri’ni ya da CD’de verdiğimiz, daha kullanışlı XML Notepad programını kullanabilirsiniz.

XML belgelerinde her bir element için Attribute, Text, Comment gibi özellikler tanımlanabiliyor. XML Notepad’de Insert menüsü altındaki komutları kullanarak bunları belgeye ekleyebilirsiniz. Attribute (öznitelik) dışında diğer ikisi sık kullanılmaz. Elementler için ek bir özellik tanımlar ve elementlere çok benzer. Örneğin her bir KITAP elementi için SAYFA adlı bir attribute ya da bir alt element kullanılabilir. SAYFA bilgisi için attribute ya da alt elementten hangisini kullanmanız gerektiğine kendiniz karar vermelisiniz.

<KITAP SAYFA="120">
   <KITAPADI>Hayvan Çiftligi</KITAPADI>
   <YAZAR>George Orwell</YAZAR>
</KITAP>

<KITAP>
   <SAYFA>120</SAYFA>
   <KITAPADI>Hayvan Çiftligi</KITAPADI>
   <YAZAR>George Orwell</YAZAR>
</KITAP>

Yukarıdaki iki elementin birincisinde SAYFA bilgisi attribute olarak tanımlanmış. Alttakinde ise bu bilgi element olarak yer alıyor. Bizim kayıtlarımızda sayfa bilgisi az kullanıldığı için bunu attribute olarak kullanmaya karar verdik. Bunun gibi yanyana birçok attibute ekleyebilirsiniz.

Comment değerleri belgede kullanılmayan ama yorum niteliği taşıyan bilgilerdir. Text değerleri ise kullanıcının serbest metin tanımlaması için oluşturulmuş.

<KITAP SAYFA="120">
   <!--İlginç bir kitap-->
   Hikayede hayvanlar insanlastirilmis...
   <KOD>3</KOD>
   <KITAPADI>Hayvan Çiftliği</KITAPADI>
   <YAZAR>George Orwell</YAZAR>
   <YAYINEVI>MEB</YAYINEVI>
   <CEVIREN>Halide Edip Adıvar</CEVIREN>
</KITAP>

Resimdeki Comment (açıklama) alanının dosya içinde <!-- ve --> arasında yer aldığına dikkat edin. Açıklama alanlarına dosyanın yapısını bozmayacak şekilde her türlü bilgi yazılabilir. Şüpheli metinler için ise CDATA bölgeleri kullanın. Belgenin yapısını değiştirmesi muhtemel metinleri CDATA bölümlerine aşağıdakine benzer şekilde yerleştirmek gerekir.

<KITAP>
   Yeni bir kitap
   <KITAPADI>Hayvan Çiftliği</KITAPADI>
   <YAZAR>George Orwell</YAZAR>
   <![CDATA[
   Buraya herhangi bir metin yazılabilir. 
   <DENEME>
   <TEST/>
   ]]>
</KITAP>

Mavi renkli satırlar CDATA bölgelerinin başlangıç ve bitişini ifade ediyor. <![CDATA[ ile ]]> arasında kalan kısımlar bu bölgeye dahildir. Buradaki tek şart bitiş etiketinin metin bölgesi içinde yer almaması gerektiğidir. Bu bölgeler XML Notepad’de Text alanları içine dahil ediliyor.

MSXML İLE ÇALIŞMAK

Microsoft’un çıkardığı XML Core Services (MSXML) paketi XML ile çalışmak için gerekli her türlü bileşeni beraberinde ücretsiz getiriyor. Web’den yüklediğiniz XML dosyalarını düzenlemeden, XSL şablonları ile biçimlendirip HTML belgeleri üretmeye kadar birçok işi bu paket yapabiliyor. MSXML’i yüklemek için CD’mizdeki msxml4.msi dosyasını bilgisayarınıza kurabilirsiniz.

XML belgeleri ile çalışırken MSXML.DOMDocument bileşenine sıkça başvurmanız gerekecek. MSXML içindeki DOMDocument bileşenini oluşturduktan sonra Load ve LoadXML yöntemlerini kullanarak XML içeriğini bu nesneye yüklemek gerekiyor.

Dim xmlbelge
Set xmlbelge = CreateObject("Msxml2.DOMDocument")
xmlbelge.async = False
xmlbelge.Load "http://www.chip.com.tr/xml/test/personel.xml"

Load satırında yerel diskteki bir dosyanın yolunu yazabilirsiniz. XML içeriğini doğrudan yüklemek için LoadXML yöntemini aşağıdaki gibi kullanın.

xmlbelge.LoadXML "xml metnini buraya yazın."

DOMDocument nesnesi web kaynağından ya da diskten bir dosya yüklerken belgenin geçerliliğini kontrol eder. Eğer alınan bilgi geçerli bir XML içeriği değilse Load fonksiyonları yanlış(false) değerini döndürürler. Bu durumda aşağıdaki gibi yükleme yapmak daha kontrollü olmayı sağlar.

If xmlbelge.Load("http://www.chip.com.tr/xml/test/personel.xml") Then
   MsgBox xmlbelge.url & " belgesinin içerigi:" & _
   vbCr & vbCr & xmlbelge.xml
Else
   MsgBox "Belge yüklenemiyor."
End If

Web alanından herhangi bir dosya yüklemek için ise XMLHTTP nesnesi etkindir. Bu bileşen Internet’teki tüm belgeleri yükleyebilir.

Dim belge
Set belge = CreateObject("MSXML2.XMLHTTP")
belge.Open "get", "http://www.chip.com.tr", False
belge.send
MsgBox belge.responseText

XMLHTTP’nin ResponseText özelliği alınan içeriği gösterir. Eğer XMLHTTP ile XML belgesini yükleyip kullanmak istiyorsanız bunu DOMDocument nesnesine iletmelisiniz.

xmlbelge.Load belge.responseXML
MsgBox xmlbelge.xml

Belgelerin arkaplanda (eşzamanlı olmadan) yüklenmesi için Async özelliği kullanılır. Bu özelliğin False olarak ayarlanması eş zamanlı çalışılacağı, yani yükleme tamamlanmadan alt satıra geçilmeyeceği anlamına gelir. Gelişmiş XML uygulamaları tasarlayanlar bu özelliği kimi zaman True olarak ayarlamak isteyebilirler.

Herhangi bir şekilde DOMDocument’e yüklediğiniz XML içeriğini dosyaya kaydetmek için Save komutunu kullanın.

xmlbelge.Save "c:\deneme.xml"

Yukarıdaki kodlarda Belge ve XMLBelge adlarına dikkat edin. Belge, bir XMLHTTP nesnesi olup herhangi bir web içeriğini ifade ediyor. XMLBelge ise DOMDocument türünde geçerli bir XML içeriğinden oluşuyor.

DOMDocument, XMLHTTP’den bilgi alırken bazı düzenlemeler yapabilir. Paragrafları ve boşlukları kendine göre yeniden düzenleyebilir. XMLHTTP ile yüklediğiniz belgelerin baş tarafında boş satır olmamasına dikkat edin. DOMDocument nesnesi maalesef üstteki boş satırları kontrol etmeyip hata oluşturuyor.

Dim metin As String
metin = belge.responseText
'üstteki boş satırlar silinmeli. ...
xmlbelge.loadXML metin


BELGE İÇERİĞİNİ DÜZENLEYİN

DOMDocument nesnesi geçerli bir XML belgesini ifade etmekle birlikte, bu belge bir çok alt belgeyi içermektedir ve bunların birçoğu için MSXML’de sınıflar oluşturulmuştur.

DOMDocument.DocumentElement sınıfı XML belgesindeki kök elementi işaret eder.

Msgbox xmlbelge.documentElement.xml
Msgbox xmlbelge.documentElement.nodename

Daha yukarıdaki satırlarda xmlbelge.xml, belgesinin tamamını gösteriyordu. Buradaki xmlbelge.documentElement.xml ise kök alanına ait bloğu ifade ediyor.

Nodename değeri ise elementin (düğümün) adı, yani personel.xml içindeki KISILER ya da kitaplar.xml içindeki KITAPLAR.

Dim xmlbelge
Set xmlbelge = CreateObject("MSXML2.DOMDocument")

xmlbelge.async = False
xmlbelge.Load "http://www.chip.com.tr/xml/test/personel.xml"

NodeGoster xmlbelge.documentElement

Sub NodeGoster(node As IXMLDOMNode)
    Dim node2 As IXMLDOMNode
    For Each node2 In node.childNodes
        If node2.nodeType = NODE_ELEMENT Then
            MsgBox node2.xml
            If node2.hasChildNodes Then NodeGoster node2
        End If
    Next
End Sub

Yukarıdaki kodu çalıştırdığınızda personel.xml içindeki tüm düğümler, tüm alt düğümler sırasıyla gösterilecek. Koddaki Node adlarına dikkat etmelisiniz. Elementler aynı zamanda bir node (düğüm) olarak adlandırılabilirler. Aslında sadece elementler değil, elemenlerin değerleri de node’dur.

HasChildNodes alt tarafta başka node olup olmadığını kontrol ediyor. ChildNodes ise alttaki tüm node’ları. Sadece elementleri listelemek istediğimiz için birinci IF satırında node türünün NODE_ELEMENT olup olmadığını kontrol ettik. Aksi halde elementlerin değerleri Msgbox ile ekranda gösterilecekti.

Node nesnelerinin içeriği Text özelliğinde tutuluyor. Bir Node’un değerine erişmek ve değerini değiştirmek için bunu kullanın.

MsgBox xmlbelge.documentElement.childNodes(0).childNodes(0).Text

Ekteki personel.xml dosyası için yukarıdaki mesaj kutusu Mustafa değerini gösterecektir. Kitaplar.xml dosyası için ise bu değer 1’dir.

personel.xml

 

<?xml version="1.0" encoding="UTF-8"?>

Tanımlayıcı ilk satır

<PERSONEL>

DocumentElement

   <KISI>

DocumentElement.ChildNodes(0)

      <AD>Mustafa</AD>

DocumentElement.ChildNodes(0).ChildNodes(0)

      <DEPARTMAN>Muhasebe</DEPARTMAN>

DocumentElement.ChildNodes(0).ChildNodes(1)

      <DOGUMYERI>Mugla</DOGUMYERI>

DocumentElement.ChildNodes(0).ChildNodes(2)

   </KISI>

 

</PERSONEL>

 

 

kitaplar.xml

 

<?xml version="1.0"?>

Tanımlayıcı ilk satır

<KITAPLAR>

DocumentElement

   <KITAP>

DocumentElement.ChildNodes(0)

      <KOD>1</KOD>

DocumentElement.ChildNodes(0).ChildNodes(0)

      <KITAPADI>Stratejik Ittifak</KITAPADI>

DocumentElement.ChildNodes(0).ChildNodes(1)

      <YAZAR>Alptekin Dursunoglu</YAZAR>

DocumentElement.ChildNodes(0).ChildNodes(2)

      <YAYINEVI>Anka</YAYINEVI>

DocumentElement.ChildNodes(0).ChildNodes(3)

   </KITAP>

 

</KITAPLAR>

 

Değerleri değiştirmek için Text özelliğini aşağıdakine benzer şekilde kullanın.

xmlbelge.documentElement.childNodes(0).childNodes(0).Text= “Murtaza”

ChildNodes içinde bu şekilde düğümler uzayıp gidebilir. Herbir düğüm IXMLDOMNode türündedir. Bu türde bir node oluşturup belge içindeki düğümlere daha kısa yoldan ulaşmayı deneyebilirsiniz.

Dim node As IXMLDOMNode
Set node = xmlbelge.documentElement.childNodes(0).childNodes(0)
node.Text = "Murtaza"
MsgBox xmlbelge.xml

Node değişkeni xmlbelge’yi doğrudan etkileyeceği için yaptığımız değişiklik xmlbelge’nin içeriğini de değiştirir. Belge içinde yeni düğüm ekleme gibi her türlü işlemi yapabilirsiniz. Aşağıdaki kodda KISI adlı yeni bir NODE ve bunun altında sırasıyla AD, DEPARTMAN, DOGUMYERI adlı alt node’lar CreateNode ile oluşturuluyor ve AppendChild ile düğüm içine ekleniyorlar.

Dim yeni As IXMLDOMNode
Set yeni = xmlbelge.createNode(NODE_ELEMENT, "KISI", "")

Dim alt As IXMLDOMNode

Set alt = xmlbelge.createNode(NODE_ELEMENT, "AD", "")
alt.Text = "yeni kişi"
yeni.appendChild alt

Set alt = xmlbelge.createNode(NODE_ELEMENT, "DEPARTMAN", "")
alt.Text = "departman"
yeni.appendChild alt

Set alt = xmlbelge.createNode(NODE_ELEMENT, "DOGUMYERI", "")
alt.Text = "dogumyeri"
yeni.appendChild alt

xmlbelge.documentElement.appendChild yeni

Bir düğümü silmek için ise RemoveChild komutunu kullanın.

xmlbelge.documentElement.removeChild yeni


xmlbelge.documentElement.removeChild xmlbelge.documentElement.childNodes(0)


Dim node As IXMLDOMNode
Set node= xmlbelge.documentElement.childNodes(0)
node.removeChild node.childNodes(0)
 

DOSYALAR:
bozuk.xml
kitaplar.xml
personel.xml


Serkan ŞAHİNOĞLU
(Chip Dergisi, Mart 2002)


http://BilgiTeknoloji.net