XPath 和 LINQ to XML 的比较

[译自: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

 

 

 

posted @ 2011-08-19 10:51  Luke Zhang  阅读(2297)  评论(0编辑  收藏  举报