XPath 和 LINQ to XML 的比較

XPath 和 LINQ to XML 在某些方面十分類似。 兩者都可用於查詢 XML 樹狀結構,將此類結果當做項目的集合、屬性的集合、節點的集合,以及項目或屬性的值傳回。 不過,這兩個選項之間有顯著的差異。

XPath 與 LINQ to XML 之間的差異

XPath 不允許評估新的類型。 它只能從樹狀結構傳回節點的集合,而 LINQ to XML 可以執行查詢並評估新圖案中的物件圖形或 XML 樹狀結構。 LINQ to XML 查詢的功能較 XPath 運算式來得多。

XPath 運算式存在於字串內的隔離中。 C# 編譯器在編譯時間無法協助剖析 XPath 運算式。 相較之下,C# 編譯器會剖析與編譯 LINQ to XML 查詢。 該編譯器可以攔截許多查詢錯誤。

XPath 結果不是強型別。 在許多情況下,評估 XPath 運算式的結果為物件,且開發人員可以決定適當的類型,並在必要時轉換結果。 相較之下,LINQ to XML 查詢的評估為強型別。

結果順序

XPath 1.0 建議事項說明,XPath 運算式評估結果的集合並未排序。

不過,逐一查看由 LINQ to XML XPath 軸方法傳回的集合時,會以文件順序傳回集合中的節點。 即使在存取 XPath 軸 (其中的述詞會根據反向的文件順序表示,例如,precedingpreceding-sibling) 時,也是如此。

相較之下,大部分的 LINQ to XML 座標軸會依文件順序傳回集合。 不過,其中兩個 (AncestorsAncestorsAndSelf) 會以反向文件順序傳回集合。 下表列舉座標軸,並指出每個座標軸的集合順序:

LINQ to XML 軸 排序
XContainer.DescendantNodes 文件順序
XContainer.Descendants 文件順序
XContainer.Elements 文件順序
XContainer.Nodes 文件順序
XContainer.NodesAfterSelf 文件順序
XContainer.NodesBeforeSelf 文件順序
XElement.AncestorsAndSelf 反向的文件順序
XElement.Attributes 文件順序
XElement.DescendantNodesAndSelf 文件順序
XElement.DescendantsAndSelf 文件順序
XNode.Ancestors 反向的文件順序
XNode.ElementsAfterSelf 文件順序
XNode.ElementsBeforeSelf 文件順序
XNode.NodesAfterSelf 文件順序
XNode.NodesBeforeSelf 文件順序

位置性述詞

在 XPath 運算式內,許多座標軸的位置性述詞都是以文件順序表示,但是反向座標軸則以反向的文件順序表示。 反向軸為:precedingpreceding-siblingancestorancestor-or-self。 例如,XPath 運算式 preceding-sibling::*[1] 會傳回正前面的同層級。 即使最後的結果集會以文件順序呈現,也是如此。

相較之下,LINQ to XML 中的所有位置性述詞都一律會以座標軸的順序表示。 例如,anElement.ElementsBeforeSelf().ElementAt(0) 會傳回所查詢項目之父代的第一個子項目,而非正前面的同層級。 另一個範例:anElement.Ancestors().ElementAt(0) 會傳回父項目。

如果您要在 LINQ to XML 中尋找正前面的項目,您可以撰寫下列運算式:

ElementsBeforeSelf().Last()
ElementsBeforeSelf().Last()

效能差異

在 LINQ to XML 中使用 XPath 功能的 XPath 查詢,其速度不及 LINQ to XML 查詢。

組合的比較

LINQ to XML 查詢的組合類似於 XPath 運算式組合,但語法非常不同。

例如,如果您在變數中有一個名為 customers 的元素,且您想要在名為 Customer 的所有子項目下,尋找名為 CompanyName 的後代子元素,您可以撰寫下列 XPath 運算式:

customers.XPathSelectElements("./Customer/CompanyName")
customers.XPathSelectElements("./Customer/CompanyName")

對等的 LINQ to XML 查詢為:

customers.Elements("Customer").Elements("CompanyName")
customers.Elements("Customer").Elements("CompanyName")

每個 XPath 座標軸都有類似的項目。

XPath 座標軸 LINQ to XML 軸
child (預設軸) XContainer.Elements
Parent (..) XObject.Parent
attribute 軸 (@) XElement.Attribute



XElement.Attributes
ancestor 軸 XNode.Ancestors
ancestor-or-self 軸 XElement.AncestorsAndSelf
descendant 軸 (//) XContainer.Descendants



XContainer.DescendantNodes
descendant-or-self XElement.DescendantsAndSelf



XElement.DescendantNodesAndSelf
following-sibling XNode.ElementsAfterSelf



XNode.NodesAfterSelf
preceding-sibling XNode.ElementsBeforeSelf



XNode.NodesBeforeSelf
following 沒有直接的對等。
preceding 沒有直接的對等。