【问题标题】:What is the difference between using "../" and "parent" in an XPath query?在 XPath 查询中使用“../”和“parent”有什么区别?
【发布时间】:2010-08-11 01:35:27
【问题描述】:

在 XPath 查询中使用“../”和“parent”获取父节点有什么区别。我原以为它们是同义词。

鉴于以下两个 XPath 查询,这两者之间真的有什么区别吗?

//Node/id[@type='image']/id[@attr1='myVal']/../../*

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*

我正在开发一个 C#/ASP.net 应用程序,并使用第一个 XPath 查询,我实际上返回了 Node 元素之前的第一个兄弟。我正在寻找的是 Node 元素本身及其所有子元素。第二个 XPath 查询将给出我预期的结果。

我想知道为什么这里有区别。

【问题讨论】:

    标签: c# asp.net xpath


    【解决方案1】:

    快速回答;是的,../ 和 parent::* 是等价的,但是你会得到不同的结果,因为你的 XPath 表达式不同。

    更长的答案;

    表达式 parent::node() 和 .. 是等价的,后者是根据 W3C XPath Recommendation 的前者的缩写形式。

    你会从 parent::* 得到类似的行为,因为 XML 形成一棵树,所以任何孩子最多只能有一个父母。

    您会得到不同结果的原因是因为它们是不同的查询。第一个在末尾有一个额外的 * (../../*),这可能是返回 Node 的子项序列。

    第二个具体获取上下文节点的父级的父级(缩写形式 ../..),这是您感兴趣的 Node 元素。

    例子:

    对于文档

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <Node>
            <id type="image">
                <id attr1="myVal"> </id>
            </id>
        </Node>
    </root>
    

    查询

    //Node/id[@type='image']/id[@attr1='myVal']/../../* 
    

    //Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*/* 
    

    返回节点id[@type='image']

    而查询

    //Node/id[@type='image']/id[@attr1='myVal']/../..
    

    //Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*
    

    返回节点Node。

    【讨论】:

    • 嗯?您的快速回答基本上不是说:是的,它们是相同的,但不,它们是不同的?
    • 这是很棒的布拉布斯特。似乎我的大部分困惑来自在 XPath 查询末尾使用“*”以及返回的确切内容。
    【解决方案2】:

    您没有得到相同的结果集,因为*您的表达式彼此等价。*

    考虑:

    1.目标节点的孙子节点

    //节点/id[@type='image']/id[@attr1='myVal']

    2。目标节点的子节点(孙子节点的父节点)(等效表达式)

    //节点/id[@type='image']/id[@attr1='myVal']/..

    //节点/id[@type='image']/id[@attr1='myVal']/parent::*

    3.目标节点(孙子的祖父母)(等效表达式)

    //节点/id[@type='image']/id[@attr1='myVal']/../..

    //节点/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*

    4.目标节点的所有子节点(等效表达式)

    //Node/id[@type='image']/id[@attr1='myVal']/../../*

    //节点/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*/*


    在链接的 XPath 测试平台上尝试等效的表达式(例如 '//parent/child[@id="2"]/grandchild[@id="2.1"]/../../*')以下。它以红色突出显示哪些节点与您提供给它的各种 XPath 表达式匹配。

    http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

    【讨论】:

    • 伟大的描述伯特。 XPath 测试页面链接非常适合测试一些搜索和查看结果。帮助很大。
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2016-06-07
    • 2021-04-23
    相关资源
    最近更新 更多