Aracılığıyla paylaş


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-siblinggibi 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, ancestorve 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ı customerstüm alt öğelerin Customeraltı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.