Linq to Xml

Hiç yorum yok
Merhaba Arkadaşlar ,

Bu bölümde Linq to Xml'e giriş yapıyor olacağız.Amacımız bir console uygulaması içinde Linq to Xml yapısına bakarak valid bir xml dosyasından verileri okumak olacak birinci bölümümüzde
daha sonrasında joinli tablolarda bu işlemlerin nasıl yapıldığına bakıyor olacağız.

Video Anlatım



1.Bölüm

İlk olarak valid xml 'i oluşturacağımız tablomuza bakalım.

Yandaki tablomuzda da görüldüğü gibi Urunler ismindeki
tablomuzu xml formatına çevirelim.Tabi bu işlemler sırasında valid olmasına dikkat edelim.Yazacağımız t-sql sorgumuz

Select UrunID '@UrunID',KategoriID '@KategoriID',UrunAdi,BirimFiyati from Urunler
 where Sonlandi=1 order by UrunAdi desc
for xml path('Urun'),root('Urunler')

yukardaki gibi olacaktır.Şimdi ise xml dosyamızın çıktısına bakalım.




Yan tarafta xml dosyamızın yapısı yer almaktadır.Şimdi
ise bir console uygulaması başlatalım ve Linq to Xml'e
giriş yapıyor olalım.Kodlara bakılacak olursa bizim seneryomuza uygun olmasada Attribute değerleri içinde
null olma ihtimaline karşı yapılacak cast işlemleri sırasında
hata alınmaması amaçlı datanın null gelme ihtimalide kontrol edilmiş olup.Yorum satırları içerisinde belirtilmişlerdir.Daha önceki video anlatımlarımızda Ado.Net ile ele almış olduğumuz xml yapısını
 Linq to Xml ile nasıl gerçekleştirebileceğimize
 bakalım şimdi.






Uygulama Kodları


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace LinqtoXml
{
    class Program
    {
       
        static void Main(string[] args)
        {
           // DosyaOku();
           // DosyaOku2();
            DosyaOku3();
            Console.ReadLine();

        }

        private static void DosyaOku3()
        {
            XElement xdoc = XElement.Load("C:\\Users\\Acer\\Desktop\\LinqtoXml\\LinqtoXml\\Product.xml");
            var urunlistesi = from k in xdoc.Elements("Urun")
                              where k.Element("UrunAdi").Value[0] == 'S'
                              select new {
                              ID=k.Attribute("UrunID").Value,
                              UrunAdi = k.Element("UrunAdi").Value,
                               KategoriID=Convert.ToInt32(k.Attribute("KategoriID").Value),
                              //Eger kategoriID null gelme ihtimali varsa
                             //KategoriID = (int?)(String.IsNullOrEmpty(k.Attribute("KategoriID").Value) ? null : (int?)Convert.ToInt32(k.Attribute("KategoriID").Value)),
                              Fiyat = Convert.ToDouble(k.Element("BirimFiyati").Value)
                            
                              };

            foreach (var urun in urunlistesi)
            {
                Console.WriteLine("{0}{1}{2}{3}",urun.ID,urun.UrunAdi,urun.KategoriID,urun.Fiyat.ToString("C2"));
            }
        }

        private static void DosyaOku2()
        {
            XElement xdoc = XElement.Load("C:\\Users\\Acer\\Desktop\\LinqtoXml\\LinqtoXml\\Product.xml");
            var urunlistesi = from k in xdoc.Elements("Urun")
                             where k.Element("UrunAdi").Value[0]=='T'
                              select k;
           // var urunlistesi = xdoc.Elements("Urun").Where(p => p.Element("UrunAdi").Value[0] == 'T').Select(p => p.Element("UrunID").Value);
            foreach (var urun in urunlistesi)
            {
                Console.WriteLine(urun.Element("UrunAdi").Value);
            }
        }

        private static void DosyaOku()
        {
            XDocument xdoc = XDocument.Load("C:\\Users\\Acer\\Desktop\\LinqtoXml\\LinqtoXml\\Product.xml");

            var urunlistesi = from k in xdoc.Element("Urunler").Elements("Urun")
                              select k;
            foreach (var urun in urunlistesi)
            {
                Console.WriteLine(urun.Element("UrunAdi").Value);
            }
        }
    }
}

2.Bölüm

Kullanılan Kategoriler ve Ürünler xml dosyaları içeriği


  Kategoriler.xml t-sql sorgusu

Select KategoriID,KategoriAdi from Kategoriler
 order by KategoriAdi desc
for xml path('Kategori'),root('Kategoriler')


Urunler.xml t-sql sorgusu


Select UrunID,UrunAdi,KategoriID,BirimFiyati from Urunler
 where Sonlandi=1 order by UrunAdi desc
for xml path('Urun'),root('Urunler')








Uygulama Source

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
namespace LingToXmlKullanimi2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dgvSonuc.DataSource = UrunlistesiKategorili();
        }

        protected object UrunlistesiKategorili()
        {
          XDocument xmlUrunler =XDocument.Load("C:\\Users\\Acer\\Desktop\\LingToXmlKullanimi\\LingToXmlKullanimi2\\Urunler.xml");
          XDocument xmlKategoriler = XDocument.Load("C:\\Users\\Acer\\Desktop\\LingToXmlKullanimi\\LingToXmlKullanimi2\\Kategoriler.xml");

          var urunlistesi = (from urun in xmlUrunler.Element("Urunler").Elements("Urun")
                             join kategori in xmlKategoriler.Element("Kategoriler").Elements("Kategori") on urun.Element("KategoriID").Value equals kategori.Element("KategoriID").Value
                             select new
                             {
                                 ID = urun.Element("UrunID").Value,
                                 UrunAdi=urun.Element("UrunAdi").Value,
                                 KategoriAdi=kategori.Element("KategoriAdi").Value,
                                 Fiyat = urun.Element("BirimFiyati").Value
                             }).ToList();

          return urunlistesi;
                                                                                      
        }
    }
}


Linq To Xml XElement,Attribute,XDocument Kullanımı  

 using System.Xml.Linq namespace altında bulunan linq to xml içeriklerini kullanmamıza olanak sağlayan bu namespace ile XElement,Attribute,XDocument kullanımı ele aldığımız uygulamamıza geçmeden valid bir xml yapısı oluşturmak için öncelikle KuzeyRuzgari veri tabanı üzerinden Products tablomuzu ele alarak valid xml yapımızı oluşturulım

select ProductID '@UrunID',ProductName,UnitPrice,UnitsInStock from Products
 order by ProductName desc
for xml path ('Urun'),root ('Urunler')


Yukarıda belirmiş olduğumuz valid xmlimizi oluşturağımız t-sql sorgumuzdan ilerleyerek elde edeğimiz xml yapısı içeriğinin bir kısmı yandaki

gibidir



 Daha sonra vs 2013 ide içerisinde bir console uygulaması başlatıp oluşan projeye sağ tık new item ile bir adet xml file ekleyelim .Ve İsmini Products olarak verelim Products.xml

Products.xml dosyamızın ilk satırında bizi karşılayan xml beyanının hemen altına mssql tarafında t-sql sorgumuzla oluşturmuş olduğumuz valid xml içeriğimizi xml filemızın içindeki xml beyanının hemen altına yapıştıralım.Ve son olarak uygulamızı çalıştırırken exenin yanından çalışacak olan load methodumuz için yapmamız gereken solution üzerine sağ tıklayıp Open Folder in File Explorer diyerek xml dosyamızın bir kopyasını bin debug klasoru içersine kopyalamak tabi istenirse xml dosyasının propertieslerini bakılarak Copy to Output Directory diyerek her F5 de bir kopyasınıda exenin yanına oluşturabilirsiniz.Artık uygulamamız kodlamaya hazır olduğuna göre başlayalım.

1) ===========================================================
XDocument xdoc = XDocument.Load("Products.xml");

            var urunlistesi = from urun in xdoc.Element("Urunler").Elements("Urun")
                              where urun.Attribute("UrunID").Value == "5"
                              let UnitPrice = urun.Element("UnitPrice")
                              where Convert.ToDouble(UnitPrice.Value) >= 900
                              select urun;


            foreach (var item in urunlistesi)
            {
                Console.WriteLine(item.Element("ProductName").Value);
            }
            Console.ReadLine();

2) ===========================================================
 XElement xdoc = XElement.Load("Products.xml");

            var urunlistesi = from urun in xdoc.Elements("Urun")
                              where urun.Element("ProductName").Value[0] == 'T'
                              select urun;


     foreach (var item in urunlistesi)
            {
                Console.WriteLine(item.Element("ProductName").Value);
            }
            Console.ReadLine();

3)  ===========================================================
 var urunlistesi = from urun in xdoc.Elements("Urun")
                              where urun.Element("ProductName").Value[0] == 'T'
                              select new
                              {
                                  UrunID = urun.Attribute("UrunID").Value,
                                  UrunAdi = urun.Element("ProductName").Value,
                                  UrunStokSayisi = urun.Element("UnitsInStock").Value,
                                  UrunFiyati = urun.Element("UnitPrice").Value
                              };

            foreach (var item in urunlistesi)
            {
                Console.WriteLine("{0},{1},{2},{3}", "UrunID " + item.UrunID, "UrunAdi " + item.UrunAdi, "Stok Sayisi " + item.UrunStokSayisi, "Fiyati " + item.UrunFiyati);
            }


  ===========================================================
Linq to Xml Crud İşlemleri

       1)     Xml dosyasına Urun Ekleme 
 
            string path = "C:\\Users\\Sinan\\Desktop\\XmlGiris\\XmlGiris\\Products.xml";
            XDocument xdoc = XDocument.Load(path);

            XElement urun = new XElement("Urun",
                new XAttribute("UrunID","98"),
                new XElement ("ProductName","Denemexml"),
                new XElement ("UnitPrice","999"),
                new XElement("UnitsInStock","1000")
                );
            xdoc.Root.Add(urun);
            xdoc.Save(path);

      2) Xml dosyasından urun silme
            string path = "C:\\Users\\Sinan\\Desktop\\XmlGiris\\XmlGiris\\Products.xml";
            XDocument xdoc = XDocument.Load(path);

            var silinecekurun = xdoc.Descendants("Urun").Single(x => x.Attribute("UrunID").Value.Equals("98"));
            silinecekurun.Remove();
            xdoc.Save(path);
   
   3)Xml dosyasında urun güncelleme

            string path = "C:\\Users\\Sinan\\Desktop\\XmlGiris\\XmlGiris\\Products.xml";
            XDocument xdoc = XDocument.Load(path);

            var guncellenecekurun = xdoc.Descendants("Urun").Single(x => x.Attribute("UrunID").Value.Equals("17"));
            guncellenecekurun.SetElementValue("UnitsInStock", "10");
            guncellenecekurun.SetElementValue("UnitPrice", 90);
            xdoc.Save(path);
===========================================================
 Not :3 numaralı uygulamada xml içeriğimizde null içerikler olmadığıdan dolayı null kavramı ele alınmamıştır.Bu noktada convert işlemleri yapılırken eğer elinizde null degerler varsa turner if ile gelen dataların degerlerinin null olma durumlarıda kontrol edilmedilir(Video Anlatımta değinilmiştir).Gene Unutulmamalıdır ki Value lar string deger döndürmekte ve gelen datanın tipine göre işlemler yapılmak istenildiğinde büyüktür küçüktür vs gibi yazacağınız kritere göre convert edilmedilir.

Umarım faydalı olur






















Hiç yorum yok :

Yorum Gönder

Soru Görüş önerileriniz için gmail plus üzerinden + layın müsait olduğumda mutlaka yanıt dönüyor olacağım.