XPath

Eyl 06, 2013

XPath, bir XML belgenin parçalarını adreslemek için XSLT(Extensible Stylesheet Language Transformations, Genişletilebilir Biçimlendirme Dili Dönüşümleri) veXpointer(XML Pointer Language (XML İşaretçi Dili)) tarafından kullanılmak üzere tasarlanmış bir dildir. XPath'in ana amacı, bir XML belgesindeki istenilen verileri aramak ve konumlandırmaktır. XPath, herhangi bir kritere göre bir düğüm listesi, tek bir düğüm veya değer döndürmek için ağaç yapısını kullanır.

XPath ifadeleri, düğüm veya düğüm kümesinin bulunduğu yerin yolunu belirten ve kapsam düğümüne göre olan desenler kullanılarak oluşturulur. Kapsam düğümü, XML belgesinde o anda bulunduğunuz bölümüdür ve XPath'te bir nokta (.) ile gösterilir. XPath aynı zamanda, belge köküne göre mutlak konumları olan örneklerin kullanımını da destekler. Belge kökü, XPath'te öne eğik çizgi (/) ile gösterilir.

Aşağıdaki tabloda XPath diliyle ilgili ağaç yapısına uygun bazı sorgu tiplerine örnek verilmiştir.

XPath Sorgusu  Anlamı  
Bilgisayarlar/Bilgisayar Bilgisayarlar içerisindeki her bir Bilgisayar elementinin alt elemenetleri ile birlikte elde edilmesini sağlar.
Bilgisayarlar/Bilgisayar /@ID Bilgisayarlar içerisindeki her bir Bilgisayar elementinin içerdiği ID değerlerinin tamamını geri döndürür.
Bilgisayarlar/Bilgisayar [@ID=7000] Bilgisayarlar içersinde Bilgisayar elementlerinden, ID değeri 7000 olan elementin ya da elementlerin elde edilmesini sağlar.
Bilgisayarlar/Bilgisayar[Fiyat<=1500] Bilgisayarlar içerisinde Bilgisayar elementlerinden Fiyat elementinin değeri 1500 veya daha az olanların elde edilmesini sağlar.
Bilgisayarlar/Bilgisayar[Fiyat>750 and Fiyat<1100]

Bilgisayarlar içerisinde, Bilgisayar elementlerinden Fiyat elementinin değeri 750 ile 1100 arasında olanların elde edilmesini sağlar.

count(/Bilgisayarlar/Bilgisayar) Toplam Bilgisayar sayısını döndürür. Dönen sonuç tekildir. Önceki sorgularda olduğu gibi bir düğüm listesi döndürülmez
sum(/Bilgisayar/Bilgisayar/Fiyat) Bilgisayarların fiyatlarının toplamı geriye döndürülür. Bilgisayar düğümleri içerisindeki Fiyat düğümlerinin fiyat özelliklerinin değerlerinin toplamı verilir.
sum(/Bilgisayarlar/Bilgisayar/Fiyat[.>700]) Fiyat elementinin değeri 700’ den yüksek olan Bilgisayar elementlerindeki Fiyat elementlerinin toplamını verir.
count(/Bilgisayarlar/ Bilgisayar/Fiyat[.>970]) Fiyat elementinin değeri 970’ ten yüksek olan Bilgisayar elementlerinin sayısını verir.

Framework Class Library tamamıyla XPath mimarisini kullanmaya yarayan tipleri barındıran System.Xml.XPath isim alanına sahiptir. Bu kütüphane sayesinde XPath sorguları gerçekleştirilebilir. Buradaki temel sınıflar yardımıyla XML dokümanları üzerinde XPath ile arama ve yer belirleme işlemlerini gerçekleştirilebilir. Bununla birlikte bir XmlDocument nesnesinin SelectNodes(Düğümleri Seç) veya SelectSingleNode(Tek Düğüm Seç) gibi metodlarında parametre olarak XPath ifadelerini kullanabilir. Hangisinin tercih edileceği, Xml dokümanı üzerinde ne gibi işlemler yapılmak istendiğine bağlıdır. Eğer Xml dokümanında belirli bir yere erişip elde edilen düğüm listelerinde değişiklikler yapılmak isteniyorsa  XmlDocument sınıfının SelectNodes veya SelectSingleNode metodları tercih edilebilir. Bununla birlikte sadece arama ve arama sonuçlarını gösterme amaçlı uygulamalarda, XPath isim alanında yer alan XPathDocument gibi sınıfları kullanmak performans ve hız açısından daha etkili sonuçlar üretecektir. XPathDocument, XPathNavigator ve XPathNodeIterator gibi sınıflar XmlDocument sınfına göre daha performanslıdır.

Sınıf  Açıklama 
XPathDocument Bir XML belgesini XSLT kullanılarak okunmasını sağlar. Okunan bu XML belgesi üzerinde herhangi bir değişiklik yapılmaz. Kaynak olarak bir DataSet, DataBase ya da Xml dokümanı kullanılaabilir.
XPathNavigator XML belgesi içerisinde hareket edilmesini sağlar. Bir Cursor(İmleç) mantığıyla çalışır. Rastgele bir alana erişebilir.
XPathExpression Derleme metodunda Xpath ifadesi kullanılır. Derleme metodu kullanılması sonucu XPathExpression oluşur.
XPathNodeIterator Seçilen düğümlerin tekrar kullanılmasını sağlar.

Uygulama:

Kullanılan Xml dosyası:

<?xml version="1.0" encoding="utf-8" ?>

<Bilgisayarlar>

  <Bilgisayar ID="7001">
     <Tür>Masaüstü</Tür>
     <İslemci>2.0</İslemci>
     <Monitor>19</Monitor>
     <Harddisk>250</Harddisk>
     <Ram>2</Ram>
     <Fiyat>1100</Fiyat>
  </Bilgisayar>

  <Bilgisayar ID="7002">
     <Tür>Laptop</Tür>
     <İslemci>1.8</İslemci>
     <Monitor>15</Monitor>
     <Harddisk>120</Harddisk>
     <Ram>1</Ram>
     <Fiyat>900</Fiyat>
  </Bilgisayar>

  <Bilgisayar ID="7003">
     <Tür>Laptop</Tür>
     <Islemci>1.8</Islemci>
     <Monitor>13</Monitor>
     <Harddisk>100</Harddisk>
     <Ram>1</Ram>
     <Fiyat>750</Fiyat>
  </Bilgisayar>

  <Bilgisayar ID="7004">
     <Tür>Masaüstü</Tür>
     <Islemci>2.6</Islemci>
     <Monitor>17</Monitor>
     <Harddisk>500</Harddisk>
     <Ram>4</Ram>
     <Fiyat>1350</Fiyat>
  </Bilgisayar>

  <Bilgisayar ID="7005">
     <Tür>Laptop</Tür>
     <Islemci>2.2</Islemci>
     <Monitor>15</Monitor>
     <Harddisk>250</Harddisk>
     <Ram>2</Ram>
     <Fiyat>1250</Fiyat>
  </Bilgisayar>

</Bilgisayarlar>

XPath dilinin kullanıldığı C# kodu:

using System;
using System.Xml;
using System.Xml.XPath;

namespace UsingXPathNavigator
{
    class Class1
    {
        static void UsingXPath()
        {
            XPathDocument doc = new XPathDocument("C:\\Users\\Documents\\
                                             Visual Studio 2008\\Projects\\xpathnobet\\
                                             xpathnobet\\bilgisayar.xml");
            XPathNavigator navigator = doc.CreateNavigator();
            XPathNodeIterator nodes = navigator.Select("Bilgisayarlar/
                                                    Bilgisayar[Fiyat>700 and Fiyat<1200]");

             while (nodes.MoveNext())
             {
                XPathNodeIterator childNodes = nodes.Current.SelectChildren
                                                               (XPathNodeType.Element);

                while (childNodes.MoveNext()) 
               {
                    if (childNodes.Current.Name == "Tür")
                    {
                        XPathNodeIterator turNodes = childNodes.Current.SelectChildren
                                                                    (XPathNodeType.Element);
                        Console.Write("Tür : ");

                        do
                        {
                            Console.Write(turNodes.Current.Value + " ");
                        }
                        while (turNodes.MoveNext());
                        Console.WriteLine();
                    }
                    else
                   {
                         Console.WriteLine(childNodes.Current.Name
                                                    + ":" + childNodes.Current.Value);
                   }
                }
               Console.WriteLine();
            }

            Console.WriteLine("Toplam Bilgisayar Sayisi (700<Fiyat<1200) " + navigator.Evaluate
                                      ("count(/Bilgisayarlar/Bilgisayar/Fiyat[.>700
                                       and .<1200])").ToString());

            Console.ReadLine();

        }
        
        static void Main(string[] args)
        {
             UsingXPath();
        }
    }
}