LINQ2XML

0 dakikada yazıldı

8100 defa okundu

Düzenle

LINQ'nun güzellikleri serime devam etmek istiyorum :) .NET Framework3.5
ile gerçek hayat projeleri yapabileceğimiz bu dönemde LINQ'nun proje
süreçlerini ciddi şekilde hızlandırdığı kesin. Daha önceki yazılarımda
kabaca LINQ2XML'den bahsetmiştim. XML verilerini LINQ ile
sorgulayarak istediğimiz verileri alabiliyor olmak önceki muadilleri
olan XMLReader'a ve XPATH'e kıyasla çok daha kolay kullanılabilir bir
arayüz sağlıyor.

Konuya hemen çok popüler bir örnek ile giriş yapmak istiyorum. TCMB web
sitesinden güncel döviz kurlarını çekmek neredeyse her yazılım
geliştiricinin deneyim ettiği bir işlemdir. Bu işlem için için eskiden
en kolay yol olarak bir dataset yaratıp dataset'e ait ReadXML metodunu
kullanıyorduk. Aslında sadece bir döviz kuru okumak için DataSet iki
complex bir nesne yaratıyor olmak ciddi anlamda sistem kaynaklarının
boşa harcanması demektir ama kimin umrunda? :) Profesyonel yol ise
XMLReader ile XPATH kullanarak uygun veriyi almak.

Peki artık LINQ varsa ve biz LINQ ile XML verilerini de
sorgulayabileceksek aşağıdaki kod yeterli olmak mı?

        Dim doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml")

        Response.Write(doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR").<ForexBuying>.Value)

Yukarıdaki kod içerisinde ilk olarak bir System.XML.Linq.XDocument
nesnesi yaratıyoruz. Dokümanımız direk web sitesinden XML belgesini
okuyor. Bir sonraki satırda ise direk LINQ2XML kullanarak verimizi
buluyoruz. Son satırı biraz parçalayarak inceleyelim.

doc.<Tarih_Date>.<Currency>

Bu kod ile hedef doküman içerisindeki XML taglarını gezerek
Tarih_Date tagları içerisinde bulunan tüm Currency taglarının
bir listesini alıyoruz. Bu listeyi aldıktan sonra LINQ Extension
Method
'larından Where'i kullanarak bir sorgu çalıştırıyoruz.

doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR")

Buradaki Where methodu bizden bir karşılaştırma fonksiyonu istiyor.
Söz konusu fonksiyon karşılaştırmak için gelen veriyi parametre olarak
alıyor. Biz Currency tagını listelediğimizde göre her bir
Currency içerisinde CurrencyName üzerinden verimizi
filtreliyoruz ve sadece CurrencyName'i "US DOLLAR" olan satırı
Currency'i istiyoruz.

Filtreleme işlemini yaptıktan sonra hala elimizde filtremize uyan bir
Currency elementi listesi var. Bize tek bir Currency döneceğini
bildiğimiz için direk söz konusu Currency'nin bu sefer de
ForexBuying elementini yakalayarak içerisinde değeri almak için de
Value metodunu kullanıyoruz.

doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR").<ForexBuying>.Value

Böylece artık elimizde dolar kuru var. Bu şekilde herhangi bir XML
dokümanı içerisinde gezmek gerçekten çok kolay. Gelin aynı XML dokümanı
içerisinde farklı bir sorgu çalıştıralım. Curreny listesi içerisinde
Isim değerinde "I" harfi bulunan kayıtların CurrencyName'lerini
listeletelim.

        Dim doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml")

 

        For Each kur In doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<Isim>.Value.Contains("I"))

            Response.Write(kur.<CurrencyName>.Value)

        Next

Yukarıda da gördüğünüz gibi XDocument üzerinden sorgumu
oluşturduktan sonra direk bir For Each döngüsüne kaynak olarak
veriyorum. Döngü içerisinde de bir Currency elementi olan kur
değişkeninin CurrencyName değerini alarak ekrana yazdırıyorum.

Anlayacağınız artık XPath bilgisi olmadan rahatlıkla XML kaynaklarını
sorgulamanız mümkün.

Hepinize kolay gelsin.