C Sharp XPath İle XML Okumak

Genel anlamda ben XPath sınıfıyla XML okumaya, XML sorgulama diyorum.Çünkü XPath sınıfıyla belirli kriterlere göre seçim yapıyoruz.Eğer XPath sınıfından yararlanmak istiyorsak,projemize System.Xml.XPath namespaceini eklememiz gerekiyor.

Öncelikle şuanda çalıştığım projenin dizininde “bin/debug/Personeller.xml” dosyası mevcuttur.Çalışmalarımı bu XML dosyası üzerinde yapacağım.”Personeller.xml” dosyasına ulaşmak istiyorsanız, önceki yazılarımdan esinlenerek Northwind’in Personeller tablosunu XML formatta elde etmeniz yeterlidir.

Öncelikle Personeller root unun içindeki Personel node ındaki, Adi elementinin değerlerini okuyalım.

XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
//XPathDocument, doğrudan XML dosyasını çeker.
XPathNavigator nav = XMLDokuman.CreateNavigator();
//XMLDokuman nesnesi içindeki XML dosyasının içinde gezinebilmemiz amacıyla(XPath komutlarını kullanarak) CreateNavigator metodu ile bir navigator oluşturduk.Bu sayede, XML dosyasının root elementi nedir, hangi attributlar vardır, nodelar nelerdir vs. gibi bilgiler nav XPathNavigator tipinden nav nesnesine yüklenmiş olur.Bir nevi XML dosyasının şeması elde edilmiştir.
//XPathNavigator nesnesi, XPath komutlarını kullanarak XML dosyası içinde gezinmemizi sağlayan metodlar barındırır.XPath komutlarını kullanarak XML nodelar içinde istediğimiz node dan istediğimiz node a zıplamalar yapabiliriz.
XPathNodeIterator ni = nav.Select("Personeller/Personel/Adi");
//Personeller/Personel/Adi(Bu bir XPath komutudur.)
//Personeller root elementinin içindeki Personel elementi içindeki Adi elementinde gezin anlamına gelmektedir.

while (ni.MoveNext())
{
//MoveNext metodu ile nodeları teker teker dolaşırız.
//ni nesnesi içindeki XPath komutu ile seçilmiş olan nodeları teker teker dolanır.
MessageBox.Show(ni.Current.Name + " " + ni.Current.Value + " " + ni.Current.NodeType);
//Current, o anda aktif olan node un özelliklerini verir.
}

Yukarıdaki kod bloğunu derleyip çalıştırdığımız zaman, mesaj kutusunda “Adi” elementinin veri ve tipinin geldiğini göreceksiniz.


Personeller root unun içindeki Personel node ındaki, Notlar elementinin değerlerini okuyalım.

            XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
            XPathNavigator nav = XMLDokuman.CreateNavigator();
            XPathNodeIterator ni = nav.Select("Personeller/Personel/Notlar");
            while (ni.MoveNext())
            {
                MessageBox.Show(ni.Current.Value);
            }

Yukarıdaki kod bloğunu derleyip çalıştırırsanız eğer, mesaj kutusunda sırayla Notların değerlerini göreceksiniz.

Buraya kadar dikkat ettiyseniz, bir elementin değerini arıyorsak, sürekli ana nodelar arasında dönerek, aradığımız isimdeki elementin değerlerini getirdi.Halbuki ben, bir ana node içindeki bütün elementlerin değerini almak istiyorum.
İşte bunuda aşağıdaki gibi yapabiliriz.

            XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
            XPathNavigator nav = XMLDokuman.CreateNavigator();
            XPathNodeIterator ni = nav.Select("Personeller/Personel/PersonelID");

            while (ni.MoveNext())
            {
                string PersonelBilgileri = "";
                PersonelBilgileri += ni.Current.Value + Environment.NewLine;
                ni.Current.MoveToNext();
                //MoveToNext : aynı node içinde bir sonraki elemente geçer.
                PersonelBilgileri += ni.Current.Value + Environment.NewLine;
                ni.Current.MoveToNext();
                PersonelBilgileri += ni.Current.Value + Environment.NewLine;
                ni.Current.MoveToNext();
                PersonelBilgileri += ni.Current.Value + Environment.NewLine;
                MessageBox.Show(PersonelBilgileri);
            }

Gördüğünüz gibi bir node ın içindeki elementlerde istediğim kadar gezinebiliyorum.


Şimdide bazı şartlara uyan nodeların, bazı elementlerini getirelim.Örn;

            XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
            XPathNavigator nav = XMLDokuman.CreateNavigator();
            XPathNodeIterator ni = nav.Select("Personeller/Personel[Ulke]/Adi");
            //Personeller/Personel[Ulke]/Adi : Personeller rootunun Personel node dında,Ulke olan personellerin Adi ni getirir.
            while (ni.MoveNext())
            {
                MessageBox.Show(ni.Current.Value);
            }

Attribute’e göre sorgulayalım.

            XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
            XPathNavigator nav = XMLDokuman.CreateNavigator();
            XPathNodeIterator ni = nav.Select("Personeller/Personel[@NO=2]/Adi");
            //Personeller/Personel[@NO=2]/Adi : Eğer Attribute u 2 olan varsa getirir.
            //Eğer başında @ işareti varsa onun Attribute olduğunu algılar.
            MessageBox.Show(ni.Current.Value);

Elementi, değerine göre sorgulayalım.

            XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
            XPathNavigator nav = XMLDokuman.CreateNavigator();
            XPathNodeIterator ni = nav.Select("Personeller/Personel[PersonelID=10]/Adi");
            //PersonelID node u 10 olanı getirir.
            while (ni.MoveNext())
            {
                MessageBox.Show(ni.Current.Value);
            }

Belirli sayısal aralığa göre sorgu.

            XPathDocument XMLDokuman = new XPathDocument("Personeller.xml");
            XPathNavigator nav = XMLDokuman.CreateNavigator();
            XPathNodeIterator ni = nav.Select("Personeller/Personel[PersonelID>=1 and PersonelID            while (ni.MoveNext())
            {
                MessageBox.Show(ni.Current.Value);
            }

Bu yazımda bundan ibaret..
Sonraki yazılarımda görüşmek üzere..
İyi çalışmalar 🙂

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Serdar dedi ki:

    Harika bir örnek.

  2. Engin T dedi ki:

    Teşekkürler güzel çalışma olmuş

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.