Birçok uygulamada xml dökümanlar ile karşılaşıyoruz. Tüm platformlarda kullanılabilir bir format olması sebebi ile data transferi söz konusu olduğunda xml formatını kullanmayı tercih ederiz. Bu makalemizde var olan bir Xml dökümanını okumayı inceliyor olacağız.

Bir Console uygulaması açalım ve projemize sağ tuş tıklayarak bir adet “Xml File” ekleyelim. Ben dosyaya “urunler.xml” adını vereceğim.

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

<Urunler>

  <Urun>

    <ID>1</ID>

    <Ad>Monitör</Ad>

    <Fiyat>200</Fiyat>

    <Kategori>Elektronik</Kategori>

  </Urun>

  <Urun>

    <ID>2</ID>

    <Ad>Buzdolabı</Ad>

    <Fiyat>1500</Fiyat>

    <Kategori>Beyaz Eşya</Kategori>

  </Urun>

  <Urun>

    <ID>3</ID>

    <Ad>Klavye</Ad>

    <Fiyat>50</Fiyat>

    <Kategori>Elektronik</Kategori>

  </Urun>

</Urunler>

“Urunler” etiketi bizim root(kök) elementimizdir. Daha sonraki etiketler ise child element olarak adlandırılırlar. Child elementlerin içerisine attribute’lar eklemek de mümkündür, ancak bizim örneğimizde kullanmadık.

Şimdi bu dökümanı okuyarak ürünlerin bilgilerini ekrana yazdıralım. İlk olarak System.Xml kütüphanesindeki tipleri kullanacağız.

using System.Xml;

 

namespace LinqToXml

{

    class Program

    {

        static void Main(string[] args)

        {

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load("..\\..\\Urunler.xml");

 

            foreach (XmlNode node in xmlDoc.GetElementsByTagName("Urun"))

            {

                Console.WriteLine(node.Name);

                Console.WriteLine("\t{0}", node["ID"].InnerText);

                Console.WriteLine("\t{0}", node["Ad"].InnerText);

                Console.WriteLine("\t{0}", node["Fiyat"].InnerText);

                Console.WriteLine("\t{0}", node["Kategori"].InnerText);

            }

        }

    }

}

Load metodu, parametre olarak verilen dosya adını exe’nin içinde bulunduğu klasör içerisinde arar. Eklediğimiz xml dökümanı proje klasörünün içine kaydedilmiş durumda. exe ise bin içerisinde bulunan debug klasörü içerisinde bulunmaktadır. Dolayısı ile ..\..\ ile iki üst klasöre geçiş yapıp verilen dosya ismini burada aranmasını söyledik. Load metodu ile XmlDocuman tipinden olan xmlDoc isimli nesne içerisine dosyamızı yükledik. Daha sonra da Her bir Urun etiketinin içerisinde gezerek ilgili değerleri ekrana yazdırdık.

image

Şimdi de aynı işi Linq To Xml kullanarak gerçekleştirmeye çalışalım. İlk olarak using bloğuna System.Xml.Linq isim alanını ekleyelim.

urunler.xml dosyasının içeriğinde küçük bir değişlik yaparak her bir Urun etiketi içerisine birer attribute ekleyelim.

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

<Urunler>

  <Urun Nitelik="true">

    <ID>1</ID>

    <Ad>Monitör</Ad>

    <Fiyat>200</Fiyat>

    <Kategori>Elektronik</Kategori>

  </Urun>

  <Urun Nitelik="true">

    <ID>2</ID>

    <Ad>Buzdolabı</Ad>

    <Fiyat>1500</Fiyat>

    <Kategori>Beyaz Eşya</Kategori>

  </Urun>

  <Urun Nitelik="false">

    <ID>3</ID>

    <Ad>Klavye</Ad>

    <Fiyat>50</Fiyat>

    <Kategori>Elektronik</Kategori>

  </Urun>

</Urunler>

Dosyayı bir XDocument nesnesine yükleyerek xml formatında kolayca ekrana yazdırabiliriz.

class Program

    {

        static void Main(string[] args)

        {

            //string ifade içerisindeki '\' karakteri farklı anlamlar barındırabileceğinden dolayı ifadenin başına '@' karakterini koyduk. Bir diğer çözüm de yukarıdaki kod örneğinde olduğu gibi karakteri çift olarak kullanmaktır.

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            Console.WriteLine(xDoc.ToString());

        }

    }

image

Şimdi de XDocument nesnesi üzerinden Element ve Elements metotlarını kullanalım.

class Program

    {

        static void Main(string[] args)

{

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            //xDoc üzerinden Element metodu ile root elementi elde ettik. Sonra Elements metodu ile içerideki her bir Urun etiketini elde ettik.

           

     //foreach (XElement urun in xDoc.Root.Elements("Urun"))

            foreach (XElement urun in xDoc.Element("Urunler").Elements("Urun"))

            {

                //Her bir Urun XElement'inin içindeki ID,Ad elementlerini okuyalım

                Console.WriteLine("{0}-{1}-{2}-{3}",

                    urun.Element("ID").Value,

                    urun.Element("Ad").Value,

                    urun.Element("Fiyat").Value,

                    urun.Element("Kategori").Value);

            }

        }

    }

image

Her bir Urun etiketi içerisindeki “Nitelik” değerini okuyalım ve true olanları ekrana yazdıralım. her bir XElement üzerinden Element metodunu çağırarak, istediğimiz child elemente erişebildiğimizi gördük. Aynı XElement üzerinden Attribute metodunu çağırarak da ilgili attribute’a ulaşabilmek mümkündür.

class Program

    {

        static void Main(string[] args)

        {

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            foreach (XElement urun in xDoc.Root.Elements())

            {

                XAttribute att = urun.Attribute("Nitelik");

                if (att != null && att.Value == "true")

                {

                    Console.WriteLine("{0}-{1}-{2}-{3}",

                    urun.Element("ID").Value,

                    urun.Element("Ad").Value,

                    urun.Element("Fiyat").Value,

                    urun.Element("Kategori").Value);

                }

            }

        }

    }

Klavye adlı ürünün Nitelik değeri false olduğundan ekranda göremeyeceğiz.

image

Urun elementi, kök için bir child elementtir. Id,Ad,Fiyat ve Kategori Elementleri de, Urun elementi için bir child elementtir. Kök üzerinden Urun elementine, oradan da Ad elementlerine erişip, isimleri ekrana yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            foreach (XElement element in xDoc.Root.Elements("Urun").Elements("Ad"))

            {

                Console.WriteLine(element.Value);

            }

        }

    }

image

Ufak bir hatırlatma yapmakta fayda var. Elements metodu tüm child elementleri getirir ve geriye IEnumerable<XElement> döndürür. Element metodu ise üzerinden çağırıldığı elementin ilk child elementini getirir ve geriye XElement döner.

Tüm ürünlerin fiyatlarının toplamını ekrana yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            //Urunler altında sadece Urun elementleri yer aldığından dolayı xDoc.Root.Elements().Sum(....) şeklinde de yazabiliriz.

            double toplamFiyat = xDoc.Root.Elements("Urun").Sum(element => double.Parse(element.Element("Fiyat").Value));

            Console.WriteLine("Toplam Fiyat : {0}", toplamFiyat);

        }

    }

image

Nitelik değeri “true” olan ürünlerin ortalama fiyatlarını ekrana yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            double ortalama = xDoc.Root.Elements().Where(xe => xe.Attribute("Nitelik").Value == "true").Average(urun => double.Parse(urun.Element("Fiyat").Value));

 

            Console.WriteLine("Ortalama Fiyat : {0}", ortalama);

        }

    }

image

Her bir ürüne karşılık adlarını elde edelim ve alfabetik olarak sıralayarak bir diziye dolduralım.

class Program

    {

        static void Main(string[] args)

        {

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            string[] isimler = xDoc.Root.Elements().Select(xe => xe.Element("Ad").Value).OrderBy(ad => ad).ToArray();

        }

    }

Urunleri kategorilerine göre gruplayalım ve her bir kategorideki toplam fiyatı ekrana yazdıralım.

class Program

    {

        static void Main(string[] args)

        {

            XDocument xDoc = XDocument.Load(@"..\..\Urunler.xml");

 

            foreach (var grup in xDoc.Root.Elements().GroupBy(xe => xe.Element("Kategori").Value))

            {

                Console.WriteLine("{0} : {1}",

                    grup.Key,

                    grup.Sum(xe => double.Parse(xe.Element("Fiyat").Value)));

            }

        }

    }

image

Gördüğünüz gibi xml dökümanlarından elde ettiğimiz veriler üzerinde linq sorguları atarak istediğimiz sonuçlara kolayca erişebiliyoruz. Bu makalede bir dökümanı okuma işlemini gerçekleştirdik. Bir sonraki sefere  Xml dökümanı güncellemek ve yeni döküman oluşturmak için izlenecek yollardan bahsediyor olacağız. Faydalı olması dileği ile…



4 yorum:

Unknown dedi ki...

İyi Günler,
Xml den çektiğim verileri datagirdviewde görüntülüyorum ancak xml'e ilk eklenen kayıt grdiviewde en üstte son eklenen kayıt en altta gözüküyor. Ben xml e son eklenen kaydı en üstte nasıl görüntüleyebilirim.

<--Diagnostics>-
<--CSEvent>
<--CSName>Şube A<-/CSName>
<--Event>OFFLINE<-/Event>
<--Timestamp>08:36:26<-/Timestamp>
<--Date>03.05.2013<-Date>
<--/ECSEvent>-
<--CSEvent>
<--CSName>Şube A<-/ECSName>
<--Event>OFFLINE<-/Event>
<--Timestamp>08:36:31<-/Timestamp>
<--Date>03.05.2013<-/Date>
<--/CSEvent>

XML bu şekildedir.

Adsız dedi ki...

Onun duası var. :)

Adsız dedi ki...

Çok teşekkürler.

Adsız dedi ki...

Merhaba,

Meryem Hn'ın sorusunun cevabı linq'da OrderByDescending() komutudur.
//Yazılım Dedektifi

Yorum Gönder