Makale Özeti

XMLDocument ,XmlWriter, XmlReader

Makale

XML ile Çalışmak

XML Dokümanı Nesne Modeli

Uygulamlarınızda XML dokümanları ile çalışabilmek için XML DOM (Document Object Model) ‘i bilmeniz gerekmektedir. Bu konuda XML DOM yapısına giriş yapacak ve doğru bir XML dosyasının yapısını öğreneceksiniz.

 

Farklı sistemlerin birbirleri ile konuşabilmelerini sağlamak için standart bir sisteme ihtiyacınız vardır. Bu yüzden temel seçim standardın metin tabanlı olmasıdır. XML tercih edilen bir iletişim standardıdır. XML dosyaları World Wide Web Consortiım (W3C) tarafından belirlenen standartlara uymalıdır.

 

Örnek bir XML dokümanı:

 

<?xml version= "1.0"?>

<urunler>

      <urun>

            <ad>AZZA Board</ad>

            <fiyat>100</fiyat>

            <miktar>23</miktar>

      </urun>

      <urun>

            <ad>Samsung 40GB HDD</ad>

            <fiyat>95</fiyat>

            <miktar>10</miktar>

      </urun>

      <urun>

            <ad>Creative Web Cam</ad>

            <fiyat>40</fiyat>

            <miktar>10</miktar>

      </urun>

      <urun>

            <ad>Pentium4 CPU</ad>

            <fiyat>150</fiyat>

            <miktar>20</miktar>

      </urun>

      <urun>

            <ad>AMD Athlon CPU</ad>

            <fiyat>100</fiyat>

            <miktar>12</miktar>

      </urun>

</urunler>

 

 

Yukarıdaki XML kodu dört adet ürün ile ilgili bazı bilgileri belirtmektedir. İyi biçimlendirilmiş bir XML dosyasında açılan her etiket kapatılmış olmalıdır.  Örneğin <urunler> etiketi </urunler> ile kapatılmıştır.

 

XML Document Object Model (DOM) XML dokümanının hafızadaki temsilidir. DOM sınıfları XML dokümanını okumayı, XML dokümanına yazmayı sağlar. .NET Framework XML dokümanında gezinmeyi ve istenilen verinin XML dokümanından alınabilmesini sağlayan sınıflar sunar.

 

Her XML dosyası üst ve alt düğümlerden (node) oluşur. Örneğin yukarıdaki XML dokümanında <urunler> düğümü bir üst düğümdür. Hemen altındaki <urun> düğümü ise alt düğümdür. <urunler> düğümü bir çok alt düğüme (<urun>) sahiptir. Aynı seviyede bulunan düğümler ise <adi>, <birimfiyat>, <miktar> düğümleridir. Bu düğümlere kardeş(sibling) düğümler denir.

 

XML DOM okunacak tüm XML verisini hafızaya yükleyerek okur. XML dokümanları ile çalışmak için .NET Framework içindeki XmlReader sınıfını kullanabilirsiniz. XMLReader sınıfı XML verisini okurkne sadece ileri ve sadece okunabilir bir yapı sunar. Okuma işlemi için tüm XML dosyasını hafızaya yüklemediği için performansı yüksektir.

 

 

XML dosyasını okumak için farklı yöntemleri öğrenmeden önce XML DOM ile veri okumak ve düzenlemeyi yapmak diğer adımlara temel olacağı için XML DOM ile XML verisi ile çalışmak gereklidir.

 

Dokumanın kök (root) düğümü XmlDocument nesnesi ile temsil edilir. XmlDocument sınıfı XmlNode sınıfından miras almaktadır. XmlDocument sınıfı xml dosyasını yüklemek ve kaydetmek gibi işlemler için kullanılır. XmlDocument sınıfının Load, LoadXml ve Save metodları XML dokumanınızın yönetimini yapabilmenizi sağlar. XmlDocument nesnesi ile XML dokümanındaki tüm düğümlere erişebilirsiniz.

 

Aşağıdaki kod parçası XML dokümanının nasıl yüklendiğini göstermektedir.

 

Dim myDocument As New XmlDocument

myDocument.Load("urunler.xml")

MsgBox(myDocument.InnerXml.ToString)

 

Yukarıdaki kod parçası urunler.xml dosyasındaki xml verisini okur ve bir mesaj kutusu ile ekranda gösterir.

 

Bu kod parçası XmlDocument nesnesini kullanarak XML dokümanını myDocument değikenine yükler. XML dokümanını bir değişkene yüklemenin iki yolu vardır. Load metodunu kullanarak bir dosya adını parametre olarak belirleyebilirsiniz. Ayrıca LoadXml metodu ile XML verisini parametre olarak verebilirsiniz.

 

Aşağıdaki kod parçası LoadXML metoduna bir string parametre olarak bir XML verisinin verilmesini göstermektedir.

 

Dim myDocument As New XmlDocument

myDocument.LoadXml("<urunler>" & _

"<urun>" & _

"<ad>AZZA Board</ad>" & _

"<fiyat>100</fiyat>" & _

"<miktar>23</miktar>" & _

"</urun>" & _

"<urun>" & _

"<ad>Samsung 40GB HDD</ad>" & _

"<fiyat>95</fiyat>" & _

"<miktar>10</miktar>" & _

"</urun>" & _

"</urunler>")

MsgBox(myDocument.InnerXml.ToString)

 

Ayrıca XmlDocument nesnesini XML verisini yazmak içinde kullanılır. XML verisini yazmak için Save metodunu kullanabilirsiniz. Aşağıdaki kod parçası XML verisinin Save metodu ile kaydedilmesini göstermektedir.

 

Dim myDocument As New XmlDocument

myDocument.LoadXml("<urunler>" & _

"<urun>" & _

"<ad>AZZA Board</ad>" & _

"<fiyat>100</fiyat>" & _

"<miktar>23</miktar>" & _

"</urun>" & _

"<urun>" & _

"<ad>Samsung 40GB HDD</ad>" & _

"<fiyat>95</fiyat>" & _

"<miktar>10</miktar>" & _

"</urun>" & _

"</urunler>")

myDocument.Save("urunler.xml")

MsgBox(myDocument.InnerXml.ToString)

 

Xml Ayrıştırıcısı Oluşturmak

 

Önceki konularda XML dokumanlarının yüklenmesi ve kaydedilmesi anlatıldı. Bu başlıkda ise XML dokumanındaki verilerin okunması ve görüntülenmesi örneklenecek.

 

Aşağıdaki kod parçası ile XML dokümanın içeriği bir Console uygulumasında ekrana basılıyor.

 

Dim myDocument As New XmlDocument

Dim xmlData As String

myDocument.Load("urunler.xml")

Dim dugum1 As XmlNode

Dim i As Integer

Dim sayac As Integer

sayac = 0

i = 1

For Each dugum1 In myDocument.DocumentElement.ChildNodes

   Console.WriteLine(vbCrLf)

   Console.WriteLine("{0}. {1} düğümü " & _

   "içerisindeki düğümler", i, dugum1.Name)

   Console.WriteLine("----------")

   Dim dugum2 As XmlNode

   For Each dugum2 In dugum1.ChildNodes

      Console.WriteLine(dugum2.Name & _

      ": " + dugum2.InnerText)

   Next

   i = i + 1

Next

Console.ReadLine()

 

XmlReader ve XmlWriter ile Çalışmak

 

XmlReader Nedir?

XmlReader sınıfı bir akımdaki veya bir dosyadaki XML verisine erişim yapabilmeyi sağlar. Bu sınıf XML dosyalarına hızlı, belleklenmeyen, sadece okunabilir ve sadece ileri doğru erişim sağlar. XmlReader sınıfı soyut bir sınıftır ve türetilen sınıflar için öğelere(element) ve özelliklere(attribute) erişim sağlar. XmlTextReader sınıfı XmlReader sınıfından türemiş sınıflardan birisidir ve XmlReader sınıfında tanımlanan metodları uygular. XmlTextReader sınıfını XML verisini okumak için kullanabilirsiniz. Ancak XmlTextReader sınıfı DTD veya Schema bilgilerine erişmeyi ve denetlemeyi sağlamaz.  XmlValidatingReader sınıfı XmlReader sınıfından türetilmiş başka bir sınıftır. Bu sınıf xml versini okumayı sağladığı gibi DTD ve schema denetimi de sağlar.

 

XmlTextReader ile XML Verisini Okumak

XmlTextReader sınıfı XML verisine hızlı biçimde erişim istendiğinde kullanılır. XmlTextReader sınıfı tüm XML verisinin tümünün hafızaya yüklenmemesi gerektiği durumlarda kullanılır. Aksine XmlDocument sınıfı belgenin tümünü hafızaya yüklemektedir.

 

XmlTextReader sınıfının bazı özellikleri :

 

Özellikler

Açıklama

AttributeCount

Düğüm içerisindeki özelliklerin sayısını verir.

Depth

Düğümün XML dokümanındaki derinliğini verir.

HasAttributes

Düğümün özellikleri olup olmadığına dair Boolean değer döner.

HasValue

Düğümün bir değer taşıyıp taşımadığına dair Boolean değer döner.

IsEmptyElement

Düğümün boş olup olmadığına dair Boolean değer döner.

Item

Bir özelliğin değerini string olarak döner.

Value

Düğümün değerini alır.

 

XmlTextReader sınıfının bazı metodları :

 

Metodlar

Açıklama

IsStartElement

Öğenin başlangıç öğesi olup olmadığını kontrol eder.

MoveToElement

Aktif özelliği içeren öğeye gider.

MoveToFirsAttribute

İlk özelliğe gider.

MoveToNextAttribute

Sonraki özelliğe gider.

Read

Akımdan sonraki düğümü okur.

ReadAttributeValue

Özelliğin değerini okur ve bir veya daha fazla düğüme ayrıştırır.

ReadString

Bir öğenin içindeki metni okur.

ReadStartElement

Aktif düğümün bir öğe olup olmadığını kontrol eder ve sonraki düğüme geçer.

ReadEndElement

Aktif düğümün bir bitiş etiketi olup olmadığını kontrol eder ve sonraki düğüme geçer.

Skip

Aktif düğümün alt düğümlerini atlar.

 

XmlTextReader nesnesi XML dokümanından veriyi okumak için aşağıdaki gibi yapılandırılmalıdır.

 

Dim xmlOkuyucu as New XmlTextReader("Urunler.xml")

 

Aşağıdaki kod parçası XmlTextReader sınıfı kullanılarak bir XML dosyasını okumayı göstermektedir.

 

  Dim reader As New XmlTextReader("urunler.xml")

  While reader.Read()

    Select Case reader.NodeType

      Case XmlNodeType.Element

        Console.Write("<" + reader.Name)

        While (reader.MoveToNextAttribute())

          Console.Write(" " & reader.Name & "=" & _

          reader.Value & "")

        End While

        Console.Write(">")

      Case XmlNodeType.Text

        Console.Write(reader.Value)

      Case XmlNodeType.EndElement

        Console.WriteLine(("</" & reader.Name & ">"))

      End Select

  End While

  Console.Read()

 

XmlWriter Nedir?

XmlWriter sınıfı ile XML akımları ve iyi biçimli XML dokümanları oluşturulabilir.

 

XmlTextWriter sınıfı XmlWriter sınıfından türemiştir. Bu sınıf ile XML verisini bir dosyaya veya bir akıma yazdırılabilir.

 

XmlTextWriter sınıfının bazı özellikleri ve metodları.

 

Özellikler

Açıklama

BaseStream

XmlTextWriter’ın yazdığı akımı (stream) döndürür.

Formatting

Xml çıktısının formatını belirler.Alabileceği değerler Indented ve None. Indented değeri ile xml düğümleri girintili olarak yazırlar. None ile ise düğümler ardı ardına yazılırlar. Görüntü olara anlaşılır gözükmesi için Indented kullanılmalıdır.

Indentation

Indented durumunda iken girintinin ne kadar olacağını belirler.

IndentChar

Indented durumunda iken girinti için kullanılacak karakteri belirler.

WriteState

Yazma durumunu verir. Alabileceği değerler. Start, Element, Attribute, Content, Prolog ve Closed.

XmlTextWriter ile XML dosyası oluşturmak

 

Aşağıdaki kod parçası XmlTextWriter sınıfının nasıl kullanıldığını göstermektedir.

 

Dim xmlYazici As New XmlTextWriter("urunler.xml", System.Text.Encoding.UTF8)

xmlYazici.Formatting = Formatting.Indented

xmlYazici.WriteStartDocument()

xmlYazici.WriteComment("urunler listesi XML dosyası")

xmlYazici.WriteStartElement("urunler") urunler başlar

 

xmlYazici.WriteStartElement("urun") urun başlar

xmlYazici.WriteStartElement("ad") ad başlar

xmlYazici.WriteAttributeString("kategori", "anakart")

xmlYazici.WriteAttributeString("ulke", "taiwan")

xmlYazici.WriteString("AZZA Board") urun değeri yazılır.

xmlYazici.WriteEndElement() ad biter

xmlYazici.WriteElementString("fiyat", "100")

xmlYazici.WriteElementString("miktar", "23")

xmlYazici.WriteEndElement() urun biter

 

xmlYazici.WriteStartElement("urun") urun başlar

xmlYazici.WriteStartElement("ad") ad başlar

xmlYazici.WriteAttributeString("kategori", "HDD")

xmlYazici.WriteAttributeString("ulke", "endonezya")

xmlYazici.WriteString("Samsung 40GB HDD") urun değeri yazılır.

xmlYazici.WriteEndElement() ad biter

xmlYazici.WriteElementString("fiyat", "95")

xmlYazici.WriteElementString("miktar", "10")

xmlYazici.WriteEndElement() urun biter

 

xmlYazici.WriteEndElement() urunler biter

 

xmlYazici.Close()

Console.WriteLine("XML dosyası oluşturuldu.")

Console.Read()

 

 

Bu kodun çalışması sonucunda aşağıdaki xml dosyası oluşacaktır.

 

 

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

<!--urunler listesi XML dosyası-->

<urunler>

  <urun>

    <ad kategori="anakart" ulke="taiwan">AZZA Board</ad>

    <fiyat>100</fiyat>

    <miktar>23</miktar>

  </urun>

  <urun>

    <ad kategori="HDD" ulke="endonezya">Samsung 40GB HDD</ad>

    <fiyat>95</fiyat>

    <miktar>10</miktar>

  </urun>

</urunler>

 

 

Cengiz HAN

cengizh@yazgelistir.com