XPath ile LINQ to XML Karşılaştırması
XPath ve LINQ to XML bazı yönlerden benzerdir. Her ikisi de bir XML ağacını sorgulamak için kullanılabilir. Bu, bir öğe koleksiyonu, öznitelik koleksiyonu, düğüm koleksiyonu veya öğe veya özniteliğin değeri gibi sonuçlar döndürebilir. Ancak, iki seçenek arasında önemli farklar vardır.
XPath ile LINQ to XML arasındaki farklar
XPath, yeni türlerin yansıtmasına izin vermez. Yalnızca ağaçtan düğüm koleksiyonları döndürebilirken, LINQ to XML bir sorgu yürütebilir ve bir nesne grafiğini veya XML ağacını yeni bir şekilde yansıtabilir. LINQ to XML sorguları XPath ifadelerinden çok daha fazlasını yapabilir.
XPath ifadeleri bir dize içinde yalıtımlı olarak bulunur. C# derleyicisi derleme zamanında XPath ifadesini ayrıştırmada yardımcı olamaz. Buna karşılık, LINQ to XML sorguları C# derleyicisi tarafından ayrıştırılır ve derlenir. Derleyici birçok sorgu hatası yakalayabilir.
XPath sonuçları kesin olarak yazılamaz. Bir dizi durumda, XPath ifadesini değerlendirmenin sonucu bir nesnedir ve uygun türü belirleyip sonucu gerektiği gibi ataması geliştiriciye bağlıdır. Buna karşılık, LINQ'ten XML sorgusuna yansıtmalar kesin olarak yazılır.
Sonuç sıralama
XPath 1.0 Önerisi, XPath ifadesini değerlendirmenin sonucu olan bir koleksiyonun sıralı olmadığını belirtir.
Ancak, LINQ to XML XPath ekseni yöntemi tarafından döndürülen bir koleksiyonda yinelenirken, koleksiyondaki düğümler belge sırasına göre döndürülür. Koşulların ve preceding-sibling
gibi preceding
ters belge sırasıyla ifade edildiği XPath eksenlerine erişirken bile bu durum söz konusudur.
Buna karşılık, LINQ to XML eksenlerinin çoğu koleksiyonları belge sırasına göre döndürür. Ancak, bunlardan Ancestors ikisi ve AncestorsAndSelf, koleksiyonları ters belge sırasına göre döndürür. Aşağıdaki tablo eksenleri numaralandırır ve her birinin koleksiyon sırasını gösterir:
LINQ to XML ekseni | Sıralama |
---|---|
XContainer.DescendantNodes | Belge sırası |
XContainer.Descendants | Belge sırası |
XContainer.Elements | Belge sırası |
XContainer.Nodes | Belge sırası |
XContainer.NodesAfterSelf | Belge sırası |
XContainer.NodesBeforeSelf | Belge sırası |
XElement.AncestorsAndSelf | Belge sırasını ters çevir |
XElement.Attributes | Belge sırası |
XElement.DescendantNodesAndSelf | Belge sırası |
XElement.DescendantsAndSelf | Belge sırası |
XNode.Ancestors | Belge sırasını ters çevir |
XNode.ElementsAfterSelf | Belge sırası |
XNode.ElementsBeforeSelf | Belge sırası |
XNode.NodesAfterSelf | Belge sırası |
XNode.NodesBeforeSelf | Belge sırası |
Konumsal koşul
XPath ifadesinde, konumsal koşullar birçok eksen için belge sırası bakımından ifade edilir, ancak ters eksenler için ters belge sırasıyla ifade edilir. Ters eksenler şunlardır: preceding
, preceding-sibling
, ancestor
ve ancestor-or-self
. Örneğin, XPath ifadesi preceding-sibling::*[1]
hemen önceki eşdüzey değeri döndürür. Son sonuç kümesi belge sırasına göre sunulsa bile bu durum söz konusudur.
Buna karşılık, LINQ to XML içindeki tüm konumsal koşullar her zaman eksenin sırası bakımından ifade edilir. Örneğin, anElement.ElementsBeforeSelf().ElementAt(0)
sorgulanan öğenin üst öğesinin ilk alt öğesini döndürür, hemen önceki eşdüzey öğeyi döndürmez. Başka bir örnek: anElement.Ancestors().ElementAt(0)
üst öğeyi döndürür.
LINQ to XML'de hemen önceki öğeyi bulmak istiyorsanız, aşağıdaki ifadeyi yazarsınız:
ElementsBeforeSelf().Last()
ElementsBeforeSelf().Last()
Performans farklılıkları
LINQ to XML'de XPath işlevini kullanan XPath sorguları LINQ to XML sorgularından daha yavaş olacaktır.
Bileşimin karşılaştırması
LINQ to XML sorgusunun bileşimi, XPath ifadesinin bileşimine benzer, ancak söz dizimi çok farklıdır.
Örneğin, adlı bir değişkende bir öğeniz varsa ve adlı customers
tüm alt öğelerin Customer
altında adlı CompanyName
bir torun öğesi bulmak istiyorsanız şu XPath ifadesini yazarsınız:
customers.XPathSelectElements("./Customer/CompanyName")
customers.XPathSelectElements("./Customer/CompanyName")
EŞDEĞER LINQ to XML sorgusu:
customers.Elements("Customer").Elements("CompanyName")
customers.Elements("Customer").Elements("CompanyName")
XPath eksenlerinin her biri için benzer paraleller vardır.
XPath ekseni | LINQ to XML ekseni |
---|---|
alt (varsayılan eksen) | XContainer.Elements |
Üst Öğe (..) | XObject.Parent |
öznitelik ekseni (@) | XElement.Attribute veya XElement.Attributes |
ata ekseni | XNode.Ancestors |
ata ekseni veya kendi ekseni | XElement.AncestorsAndSelf |
alt eksen (//) | XContainer.Descendants veya XContainer.DescendantNodes |
descendant-or-self | XElement.DescendantsAndSelf veya XElement.DescendantNodesAndSelf |
takip eden eşdüzey | XNode.ElementsAfterSelf veya XNode.NodesAfterSelf |
önceki eşdüzey | XNode.ElementsBeforeSelf veya XNode.NodesBeforeSelf |
Aşağıdaki | Doğrudan eşdeğeri yok. |
Önceki | Doğrudan eşdeğeri yok. |