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 軸時,例如 preceding 和 preceding-sibling,也是如此。
相較之下,大部分的 LINQ to XML 軸會依文件順序傳回集合。 不過,其中的Ancestors和AncestorsAndSelf會以文件的反向順序傳回集合。 下表列出軸,並指出每個軸的收集順序:
| 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 表達式中,位置謂詞會以多數座標軸的文件順序表示,而對於反向座標軸則以反向的文件順序表示。 反向軸為: preceding、 preceding-sibling、 ancestor、 和 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 |
| 以後 | 沒有直接等值物。 |
| 前 | 沒有直接等值物。 |