c# - 在 XPath 查询中使用 "../"和 "parent"有什么区别?

标签 c# asp.net xpath

在 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 查询将给我预期的结果。

我想知道为什么这里会有差异。

最佳答案

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

更长的答案;

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

您将从 parent::* 获得类似的行为,因为 XML 形成了一棵树,因此任何子级最多只能有一个父级。

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

第二个专门获取上下文节点父节点的父节点(缩写形式 ../..),这是您感兴趣的 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。

关于c# - 在 XPath 查询中使用 "../"和 "parent"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/972735/

相关文章:

c# - 基于两个参数在文本框中使用上下文键自动完成?

c# - ASP.Net Web API 2 方法未显示正确数据但行数正确

python - Xpath - 即使我只得到 1 个元素 - 检查器工具显示 7

asp.net - 在 iis 7.5 中设置物理内存限制是否会导致垃圾收集器更积极地运行?

java - 使用 eXist-db 进行不区分大小写的搜索

mysql - 使用 ExtractValue 获取 XML 字符串中的节点名称?

c# - 什么是NullReferenceException,如何解决?

c# - Visual Studio 2017 中的错误 "missing assembly reference"

c# - BeautifulSoup 类似于 C#

c# - 如何解决与实体依赖 DDD 中的其他实体相关的性能/内存问题?