LINQ etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
LINQ etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Serinin önceki bölümlerinde döküman okuma ve döküman güncelleme kısımlarını ele almıştık. Bugün de linq to xml ile döküman oluşturacağız.

Bir console uygulaması açarak basit bir örnek ile konuyu ele almaya başlayalım. Koordinat adında kök elementimiz olsun, içerisinde de Nokta adında elementler olsun ve her nokta içerisinde X, Y ve Z isminde child elementler tanımlayalım. İşlemi yapmaya bir döküman oluşturarak başlayacağız. Ardından bu döküman üzerine elementlerimizi ekleyeceğiz ve son adım olarak da dökümanı kaydedeceğiz.

class Program

    {

        static void Main(string[] args)

        {

            XDocument dokuman = new XDocument();

 

            dokuman.Add(

                new XElement("Koordinat", //root element

                    new XElement("Nokta", //child element

                        new XElement("X", 2),

                        new XElement("Y", 5),

                        new XElement("Z", -1)),

                    new XElement("Nokta",

                        new XElement("X", 0),

                        new XElement("Y", 0),

                        new XElement("Z", 0)),

                    new XElement("Nokta",

                        new XElement("X", -2),

                        new XElement("Y", 1),

                        new XElement("Z", 4))));

 

            dokuman.Save("Koordinatlar.xml");

 

        }

    }

oluşturduğumuz döküman exe’nin içinde bulunduğu klasöre, yani debug içerisine kaydedilecektir. Projemize sağ tuş tıklayarak “open folder in windows explorer” seçeniğne tıklayarak projemizin klasörüne gidebilir, buradan da bin –> debug klasörü içerisinde oluşturduğumuz xml dökümanını görebiliriz.

image

Bu işlemi direk olarak XElement tipi üzerinden de gerçekleştirmek mümkündür. Tek satırda döküman oluşturmak için bir XElement örnekleyerek içerisine child elementleri tanımlayabilir ve yine bu XEelement üzerinden Save metodunu çağırabiliriz.

class Program

    {

        static void Main(string[] args)

        {

            new XElement("Koordinat", //root element

                new XElement("Nokta", //child element

                    new XElement("X", 2),

                    new XElement("Y", 5),

                    new XElement("Z", -1)),

                new XElement("Nokta",

                    new XElement("X", 0),

                    new XElement("Y", 0),

                    new XElement("Z", 0)),

                new XElement("Nokta",

                    new XElement("X", -2),

                    new XElement("Y", 1),

                    new XElement("Z", 4))).Save("Koordinatlar2.xml");

        }

    }

 

image

Bir başka örnek üzerinden ilerleyelim. Sayilar adında bir döküman oluşturalım. İçerisinde Sayi adında child elementler olsun ve her element içerisinde sayının değerini, karesini ve küpünü göstermeye çalışalım. Bir de nitelik ekleyerek sayının asal olup olmama durumunu gösterelim.

class Program

    {

        static void Main(string[] args)

        {

            new XElement("Sayilar",

                new XElement("Sayi",

                    new XAttribute("AsalMi", true),

                    new XElement("Değeri", 5),

                    new XElement("Karesi", 25),

                    new XElement("Küpü", 125)),

                new XElement("Sayi",

                    new XAttribute("AsalMi", false),

                    new XElement("Değeri", 8),

                    new XElement("Karesi", 64),

                    new XElement("Küpü", 512))).Save("Sayilar.xml");

        }

    }

image

Şimdi de oluşturacağımız döküman için kullanacağımız dataların bir veri tabanından geldiğini düşünelim. Bunun için projemize bir Entity Data Model ekleyelim. (AdventureWorks veri tabanını kullanarak ilerliyor olacağım) Amacımız, Product tablosundaki en pahalı 5 ürünün adını ve kategori adını xml formatında yazdırmak olacak.

class Program

    {

        static void Main(string[] args)

        {

            AdventureWorksEntities context = new AdventureWorksEntities();

 

            new XElement("Urunler",

                context.Product.OrderByDescending(p => p.ListPrice).Take(5).ToList().Select(urun =>

                    new XElement("Urun",

                        new XElement("UrunAd", urun.Name),

                        new XElement("Kategori", urun.ProductSubcategory.ProductCategory.Name)))).Save("urunler.xml");          

 

        }

    }

image

Bir başka örnek ile devam edelim. ProductSubCategory tablosundaki ilk 5 alt kategoriyi çekerek isimlerini ve bu isimlere bağlı ilk 5 ürünü xml formatta oluşturmaya çalışalım.

class Program

    {

        static void Main(string[] args)

        {

            AdventureWorksEntities context = new AdventureWorksEntities();

 

            new XElement("Urunler",

                context.ProductSubcategory.Take(5).ToList().Select(sub =>

                    new XElement(sub.Name.Replace(" ", string.Empty),

                        sub.Product.Take(5).ToList().Select(urun =>

                            new XElement("Urun",

                                new XElement("Ad", urun.Name),

                                new XElement("Fiyat", (int)urun.ListPrice)))))).Save("urunler2.xml");

 

        }

    }

Burada alt kategori isimlerini yazdırırken Replace metodunu kullandık. Çünkü gelen alt kategori isimleri boşluklar içermektedir. Xml elementi tanımlarken boşluk kullanamayız. Oluşturduğumuz döküman aşağıdaki gibidir.

image

Yukarıdaki örneği bir üst seviyeye çıkaralım. İlk olarak Kategori isimlerinden elementler oluşturalım. Daha sonra bu kategorilere bağlı ilk 5 alt kategori ve bu alt kategorilere bağlı ilk 5 ürünü xml formatta bir dökümana kaydedelim.

class Program

    {

        static void Main(string[] args)

        {

            AdventureWorksEntities context = new AdventureWorksEntities();

 

            new XElement("Urunler",

                context.ProductCategory.ToList().Select(category =>

                    new XElement(category.Name,

                        category.ProductSubcategory.Take(5).ToList().Select(subCategory =>

                            new XElement(subCategory.Name.Replace(" ", string.Empty),

                                subCategory.Product.Take(5).ToList().Select(product =>

                                    new XElement("Urun",

                                        new XElement("Ad", product.Name)))))))).Save("urunler3.xml");

 

        }

    }

image

Şimdi de bir html dökümanı oluşturmaya çalışalım. Bir tablo oluşturarak ürünlerin id, ad ve fiyat bilgilerini görüntüleyelim.

class Program

    {

        static void Main(string[] args)

        {

            AdventureWorksEntities context = new AdventureWorksEntities();

 

            new XElement("html",

                new XElement("head",

                    new XElement("title", string.Format("{0} tarihinde LINQ to XML ile dinamik olarak üretildi.", DateTime.Now))),

                new XElement("body",

                    new XElement("table",

                        new XAttribute("border", 1),

                        new XElement("tr",

                            new XElement("td", "ID"),

                            new XElement("td", "Ad"),

                            new XElement("td", "Fiyat")),

                        new AdventureWorksEntities().Product.OrderByDescending(p => p.ListPrice).Take(10).ToList().Select(p =>

                            new XElement("tr",

                                new XElement("td", p.ProductID),

                                new XElement("td", p.Name),

                                new XElement("td", p.ListPrice.ToString())))))).Save("Anasayfa.html");

 

        }

    }

NOT: Bir dosyanın uzantısı o dosyanın tipini belirtmez. Çift tıklandığında hangi program ile açılacağını belirtir.

Oluşan dökümanı browserda açalım. Aşağıdaki gibi bir görüntü ile karşılaşacağız.

image



Bir önceki makalemizde xml dökümanların nasıl okunduğunu incelemiştik. Bugün ise xml formattaki bir döküman içerisinde güncelleme yapacağız.

Bir consol uygulaması açalım ve projeye add new item diyerek xml dosyası 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>

Yapacağımız işlemin, sql’den bir data çekip güncelleme işleminden hiç bir farkı yok aslında. Tek yapmamız gereken, güncelleyeceğimiz elementi elde etmek ve gereken değerleri set etmek olacak. Daha sonra da döküman üzerinden Save metodunu çağıracağız.

Id’si 1 olan ürünün fiyatını 500 yapalım.

class Program

    {

        static void Main(string[] args)

        {

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

 

            //XElement currentElement = xDoc.Root.Elements().FirstOrDefault(xe => xe.Element("ID").Value == "1");

            XElement currentElement = xDoc.Root.Elements().FirstOrDefault(xe => double.Parse(xe.Element("ID").Value) == 1);

           

            currentElement.SetElementValue("Fiyat", 500);

           

            xDoc.Save(@"..\..\Urunler.xml");

            Console.WriteLine(xDoc.ToString());

        }

    }

Untitled

Kategorisi Beyaz Eşye olan ürünlerin nitelik attribute’ünü false yapalım.

class Program

    {

        static void Main(string[] args)

        {

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

 

            foreach (XElement currentElement in xDoc.Root.Elements().Where(xe => xe.Element("Kategori").Value == "Beyaz Eşya"))

            {

                currentElement.SetAttributeValue("Nitelik", "false");

            }

            xDoc.Save(@"..\..\Urunler.xml");

 

            Console.WriteLine(xDoc.ToString());

        }

    }

Untitled

Son olarak, ID’si 3 olan ürünü silelim.

class Program

    {

        static void Main(string[] args)

        {

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

           

            XElement deletedElement = xDoc.Root.Elements().FirstOrDefault(xe => xe.Element("ID").Value == "3");

           

            deletedElement.Remove();

           

            xDoc.Save(@"..\..\Urunler.xml");

 

            Console.WriteLine(xDoc.ToString());

        }

    }

 

image

Bir sonraki seride Xml formatında döküman oluşturma işlemini ele alıyor olacağız. Faydalı olması dileği ile…