.NET Framework ile gelen varsayılan LINQ sağlayıcılarından biride LINQ To XML’dir. LINQ To XML, LINQ mimarisinin XML verilerden sorgulama ve güncelleme yapmak için uyarlanmış versiyonudur. Bütün LINQ sağlayıcılarının kendilerine has yapıları olmakla beraber temelde LINQ mimarisi olduğu için benzer kullanımları vardır. Bu bakımdan LINQ To XML ile ilgili bir iki örnek dışında çok fazla detaya girilmeyecektir. Nitekim LINQ To SQL’de geçerli olan bir çok sorgulama metotları burada da geçerlidir.
LINQ To XML ile ilgili sınıfların tamamı System.Xml.Linq isim alanında bulunur. Dolayısıyla bu isim alanının koda eklenmesi gerekir.
İlk örnek olarak LINQ To XML sınıfları yardımıyla projemize bir XML verisi hazırlayalım. Aşağıdaki örnkte System.XML.Linq isim alanında bulunan sınıflar kullanılarak bir XML verisi hazırlanıp dosyaya kaydedilmektedir.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQToXML
{
class Program
{
static void Main(string[] args)
{
XElement xml = new XElement("menuler",
new XElement("menu",
new XAttribute("menuNo", "1"),
new XAttribute("fiyat", "15"),
new XElement("anayemek", "Adana Kebabı"),
new XElement("corba", "Ezogelin")
),
new XElement("menu",
new XAttribute("menuNo", "2"),
new XAttribute("fiyat", "34"),
new XElement("anayemek", "Karışık Kebap"),
new XElement("corba", "Domates")
)
);
xml.Save("Yemekler.xml");
}
}
}
Program derlenip çalıştırıldığında aşağıdaki gibi bir XML dosyasının hazırlandığı görülecektir.
<?xml version="1.0" encoding="utf-8"?>
<menuler>
<menu menuNo="1" fiyat="15">
<anayemek>Adana Kebabı</anayemek>
<corba>Ezogelin</corba>
</menu>
<menu menuNo="2" fiyat="34">
<anayemek>Karışık Kebap</anayemek>
<corba>Domates</corba>
</menu>
</menuler>
Görüldüğü gibi System.Xml.Linq isim alanındaki XElement ve XAttribute gibi sınıfları yardımıyla XML veriler çok daha hızlı ve kolay bir şekilde hazırlanabilmektedir.
Veritabanımızda bulunan Urunler tablosunda bulunan bütün ürünleri alarak aşağıdaki gibi XML verisi oluşturmak ise oldukça basit.
<?xml version="1.0" encoding="utf-8"?>
<urunler>
<urun UrunId="1" KategoriId="2">
<UrunAdi>Coca Cola</UrunAdi>
<Fiyat>13</Fiyat>
</urun>
<urun UrunId="4" KategoriId="2">
<UrunAdi>Meyve Suyu</UrunAdi>
<Fiyat>14</Fiyat>
</urun>
<urun UrunId="27" KategoriId="1">
<UrunAdi>VB.NET</UrunAdi>
<Fiyat>35</Fiyat>
</urun>
……
<urunler>
XElement ve LINQ To SQL sorguları iç içe kullanılarak ilişkisel veri çok hızlı bir şekilde XML verisine dönüştürülebilmektedir.
Northwind db = new Northwind();
XElement xmlUrunler = new XElement("urunler",
from u in db.Urunler
orderby u.Fiyat
select new XElement("urun",
new XAttribute("UrunId", u.UrunId),
new XAttribute("KategoriId", u.KategoriId),
new XElement("UrunAdi", u.UrunAdi),
new XElement("Fiyat", u.Fiyat))
);
xmlUrunler.Save("Urunler.xml");
XML veri üzerinden sorgulama yapmakta oldukça basit bir işlemdir. Ancak XML varlıklarına ilişkin sınıflar yaratılmadığı için LINQ sorgularında XElement ve XDocument sınıfının bir takım metotları kullanılmak zorundadır. Örneğin bir xml veri içindeki bütün “Urun” isimli düğümleri elde etmek isterseniz XDocument sınıfınnın Descendants isimli metodunu kullanmalısınız.
Aşağıdaki örnekte daha önce oluşturduğumuz Urunler.xml dosyasından ürün fiyatı 100’den büyük olan ürünlerin bilgisi elde ediliyor.
XDocument doc = XDocument.Load("Urunler.xml");
var sonuclar = from u in doc.Descendants("urun")
where (int)u.Element("Fiyat") > 100
select new Urun {
UrunId = (int)u.Attribute("UrunId"),
UrunAdi=(string)u.Element("UrunAdi")
};
foreach (var urun in sonuclar)
{
Console.WriteLine(urun.UrunAdi);
}
Not : Mevcut bir XML dosyasını belleğe yüklemek için System.Xml.Linq isim alanında bulunan XDocument sınıfı kullanılır.
Yukarıdaki örnekten de görüldüğü üzere düğüm ve nitelik değerlerine Linq To Sql’den farklı olarak XElement sınıfın Attribute ve Element isimli metotları ile erişilmiştir.
Linq To Xml nesneleri kullanılarak veri üzerinde güncelleme yapmakta oldukça kolaydır. Veri güncelleme, silme ve ekleme işlemleri için de yine XElement sınıfının Add, ReplaceAttribute, SetAttributeValue, Remove gibi metotlar kullanılır.
Aşağıdaki örnekte xml dosyasında bulunan ürünlerden ürun kategori numarası 2 olan ürünlerin tamamının fiyatı 10 YTL artırılıp kaydediliyor.
XDocument doc = XDocument.Load("Urunler.xml");
var guncelle = from u in doc.Descendants("urun")
where (int)u.Attribute("KategoriId") == 2
select u;
foreach (var urun in guncelle)
{
int fiyat = (int)urun.Element("Fiyat");
urun.SetElementValue("Fiyat", fiyat + 10);
}
doc.Save("Urunler.xml");
XElement sınfının daha bir çok metodu vardur. İhtiyacınıza göre bu metotları veri güncelleme, silme ve ekleme amaçlı kullanabilirsiniz.