PAYATHON 2026

如何用 XPath 只查询指定节点的直接子 Check 节点?

数据阿明

应该使用哪个 XPath?

如果查询上下文是目标父元素,例如示例中的 Item,可以使用:

./Check[Level = "Warning"]

也可以简写为:

Check[Level = "Warning"]

这两种写法都只检查当前节点的直接子 Check 节点,不依赖父元素的标签名。以 Item 为上下文时,示例中只会选中 Number 为 1315 的节点;查询条件并未使用 Number。

如果上下文是整个 XML 文档,且 Item 是文档根元素,可以使用:

/*/Check[Level = "Warning"]

其中 * 匹配文档根元素,无需写死 Item 这个标签名。

为什么 //Check 会返回两个节点?

开头的 //Check 会查找文档中任意深度的 Check 元素,所以下面两个位置都会被匹配:

Item/Bin/Check    Number 为 1311
Item/Check        Number 为 1315

它们都满足 [Level = "Warning"]。这个条件只筛选 Level,不限制 Check 与 Item 之间的层级关系。

./Check 只查找当前上下文节点的直接子 Check 元素,不会继续进入 Bin 查找。

为什么 ./Check 可能返回空结果?

. 表示当前上下文节点,它不一定是 XML 中看到的 Item 元素。

如果执行查询时传入的是文档节点,结构可以理解为:

文档节点
└── Item
    ├── Identifier
    ├── Bin
    │   └── Check
    ├── Check
    └── Check

此时 ./Check 查找的是文档节点的直接子 Check 元素。文档节点的直接子元素是 Item,所以查询没有结果。

原问题没有提供调用 XPath 的语言、库或代码,无法确定实际使用的上下文。应先检查传给 XPath 求值接口的是文档节点还是 Item 元素。

如何选择合适的写法?

查询上下文及条件XPath
当前节点就是目标父元素,标签名可以不同./Check[Level = "Warning"]
当前节点是文档节点,目标父元素是文档根元素/*/Check[Level = "Warning"]
目标父元素是文档根元素,且明确名为 Item/Item/Check[Level = "Warning"]

对于给出的 XML,以上表达式在各自前提下都会选中以下节点:

<Check>
<Number>1315</Number>
<Level>Warning</Level>
</Check>

如果目标父元素位于更深层级,应先定位或取得该元素,再以它为上下文执行 ./Check[Level = "Warning"]。/*/Check 只适用于目标父元素是文档根元素的情况。

父元素的标签名可以省略,但仍需确定目标父节点的位置或上下文。XPath 无法仅凭“直接子节点”判断你希望以哪个元素作为查询起点。

备注:内容仅供参考。