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 軸 (其中的述詞會根據反向的文件順序表示,例如,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
的元素,且您想要在名為 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 | 沒有直接的對等。 |