• 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

     

  • 相关阅读:
    小程序首页不显示tabbar
    小程序之背景音乐——wx.backgroundAudioManager
    根据浏览器分辨率自动调整网页宽度的一个例子
    vue 限制input[type=number]的输入位数策略整理
    php刷新当前页面
    PHP中获取当前页面的完整URL
    如何使用php session
    常用网页播放器代码
    php session 生命周期代码实例
    去掉删除discuz x3.2 的-Powered by Discuz!
  • 原文地址:https://www.cnblogs.com/ceachy/p/2145414.html
Copyright © 2020-2023  润新知