[译自:http://msdn.microsoft.com/en-us/library/bb675156.aspx]
XPath 和 LINQ to XML 的比较
XPath 和 LINQ to XML 提供了一些类似的功能。两者可用于查询返回元素的集合、属性的集合,集合的节点或元素或属性的值作为这种结果的 XML 树。但是,也有一些差异。
XPath 和 LINQ 的差异
XPath 不允许投影的新类型。它只可以从树中,返回节点的集合,而 LINQ to XML 可以执行查询和项目的对象图或 XML 树中一个新的形状。LINQ to XML 查询包含更多的功能,比 XPath 表达式的强大得多。
XPath 表达式字符串存在于一个单独的区域,C# 或 Visual Basic 编译器不能帮助分析在编译时的 XPath 表达式。与之相反,LINQ to XML 查询分析和编译的 C# 或 Visual Basic 编译器,能够捕获许多查询错误。
XPath 的结果不是强类型的。在一些情况下,XPath 表达式的计算结果是一个对象,和它是由开发人员确定正确的类型,并强制转换为所需的结果。与之相反,从 LINQ 预测,以 XML 查询是强类型的。
排序
XPath 1.0 建议指出, XPath 表达式的计算结果是无序。
然而,当遍历 XML XPath 轴方法返回的 LINQ 的集合,按文档顺序返回集合中的节点。这是访问的 XPath 轴时,甚至谓词的反向文档顺序,如前和前一个同级的表示在。
与之相反,大部分的 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 表达式中很多轴的位置谓词用文档顺序表示,但反向文档顺序用反向坐标轴表示,是前辈, 同辈、祖先与祖先或自我的表达。例如,XPath 表达式preceding-sibling::*[1]返回前一个同级。这是即使最终结果集显示文档中的顺序。
与之相反,LINQ to XML 中的所有位置谓词是始终表示的轴的顺序。例如,anElement.ElementsBeforeSelf().ToList() [0] 返回查询的元素,非直接的前一个同级的父级的第一个子元素。另一个例子: anElement.Ancestors().ToList() [0] 返回父元素。
请注意,上面的方法实现整个集合。这不是最有效的方法编写的查询。它是以这种方式来演示该行为的位置谓词。写入相同的查询更合适的方法是使用第一种方法,如下: anElement.ElementsBeforeSelf().First()。
如果您想要查找的前一个元素在 LINQ to XML,您应编写下面的表达式:
ElementsBeforeSelf().Last()
性能差异
在 LINQ to XML 中使用 XPath 功能的 XPath 查询,其性能不如直接使用的查询。
组成的比较
LINQ to XML 查询的组成是基本相当于XPath 表达式的组成,虽然有非常不同的语法。
例如,如果元素在变量命名为customers,与您要查找命名为CompanyName的孙元素名称下名为customers的所有子元素,则用如下所示编写 XPath 表达式:
Customers.XPathSelectElements("./Customer/CompanyName") ;
There are similar parallels for each of the XPath axes.
XPath 轴运算 |
LINQ to XML轴运算 |
child (the default axis) |
XContainer.Elements
|
Parent (..) |
XObject.Parent
|
attribute axis (@) or XElement.Attributes
|
XElement.Attribute |
ancestor axis |
XNode.Ancestors
|
ancestor-or-self axis |
XElement.AncestorsAndSelf
|
descendant axis (//) or XContainer.DescendantNodes
|
XContainer.Descendants |
descendant-or-self or XElement.DescendantNodesAndSelf
|
XElement.DescendantsAndSelf |
following-sibling or XNode.NodesAfterSelf
|
XNode.ElementsAfterSelf
|
preceding-sibling or XNode.NodesBeforeSelf
|
XNode.ElementsBeforeSelf |
following |
No direct equivalent. |
preceding |
No direct equivalent. |
另外,更多内容请参见LINQ to XML for XPath Users