共用方式為


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-siblingancestor、 和 ancestor-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的變數中有一個元素,並且您想要在所有名為CompanyName的子元素下尋找名為Customer的孫元素,您會撰寫此 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 軸
子項(預設軸) XContainer.Elements
家長 (..) XObject.Parent
屬性軸 (@) XElement.Attribute



XElement.Attributes
祖先軸 XNode.Ancestors
祖先或自身軸 XElement.AncestorsAndSelf
下行軸 (//) XContainer.Descendants



XContainer.DescendantNodes
後代或自身 XElement.DescendantsAndSelf



XElement.DescendantNodesAndSelf
後續兄弟節點 XNode.ElementsAfterSelf



XNode.NodesAfterSelf
前一兄弟節點 XNode.ElementsBeforeSelf



XNode.NodesBeforeSelf
以後 沒有直接等值物。
沒有直接等值物。