添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
我去  ·  How do I find an ...·  3 年前    · 
我去  ·  How to get text/value ...·  3 年前    · 
g4bwgqwov  ·  Scrapy 入门教程 | 菜鸟教程·  3 年前    · 
我去  ·  Xpath ...·  4 年前    · 
我去  ·  selenium+requests进行coo ...·  5 年前    · 

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 轴

在 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 轴 Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

提交和查看相关反馈