为啥 XPath 表达式只选择第一个元素的文本?

Posted

技术标签:

【中文标题】为啥 XPath 表达式只选择第一个元素的文本?【英文标题】:Why does XPath expression only select text of first element?为什么 XPath 表达式只选择第一个元素的文本? 【发布时间】:2021-12-18 18:04:07 【问题描述】:

给定这样的 XML 结构:

<?xml version="1.0" encoding="UTF-8"?>
<JSON>
<allFiles>

<_-Mna81v3-W_7WC1w69n9>
 <name type="string">File1</name>
 <reason type="string">Issue1</reason>
 <status type="string">Pending</status>
 <submissionTime type="string">11/3/2021, 10:11:37 AM</submissionTime>
</_-Mna81v3-W_7WC1w69n9>


<_-Mna83OkLF8vB8fV6CIy>
 <name type="string">File2</name>
 <reason type="string">Other</reason>
 <status type="string">Pending</status>
 <submissionTime type="string">11/3/2021, 10:11:44 AM</submissionTime>
</_-Mna83OkLF8vB8fV6CIy>

</allFiles>
</JSON>

您可以看到 allFiles 中的子节点是通用名称,我该如何定位它们?

我尝试通过以下方式退货

/JSON/allFiles[1]

File1 IssuePending11/3/2021, 10:11:37 AMFile2OtherPending11/3/2021, 10:11:44 AM

/JSON/allFiles/* 返回第一个子节点如下

File1 Issue1Pending11/3/2021, 10:11:37 AM

我很困惑如何定位 allFiles 的子节点(_-Mna81v3-W_7WC1w69n9_-Mna83OkLF8vB8fV6CIy)而不在命令中提及它们的名称,因为它们是通用的并且会发生变化。

【问题讨论】:

正如 Kay 博士所回答的,您的 /JSON/allFiles/* 语法是正确的,但如果它以您显示的字符串格式返回节点,您需要提供有关如何调用XPath 以及您使用的工具。 【参考方案1】:

您可以使用/JSON/allFiles/* 来选择所有这些元素。

我对 XML 文档的设计似乎有些奇怪,但对我来说这是一个新的设计!

【讨论】:

【参考方案2】:

/JSON/allFiles/*返回第一个子节点如下

File1 Issue1Pending11/3/2021, 10:11:37 AM

/JSON/allFiles/* 确实选择了allFiles 的所有子元素。

但是,您看到的只是第一个此类元素的string value。例如,在 XPath 1.0 中,当 /JSON/allFiles/*(一个节点集)的结果被传递给一个需要字符串的函数时,就会发生这种情况。函数对第一个元素的字符串值进行操作的标准行为——对于初学者来说,这是可以理解的令人惊讶的结果。

您的选择取决于您如何使用/JSON/allFiles/*

在宿主语言(XSLT、Python、Java 等)的上下文中,您可以迭代节点集,而不是将其传递给需要字符串的函数。 在编辑器或其他工具的上下文中,您通常可以选择以标记而不是文本的形式查看结果。 (如果该工具没有注意迭代结果并然后转换为字符串值,它可能会受到与上述相同的限制。)

另见

Testing text() nodes vs string values in XPath Explanation of the same effect with contains()

我尝试通过以下方式退货

/JSON/allFiles[1]

File1 IssuePending11/3/2021, 10:11:37 AMFile2OtherPending11/3/2021, 10:11:44 AM

XPath 选择JSON 的第一个allFile 子级。您的结果再次表明您将结果视为 字符串值 而不是标记。

另见

How to select first and last elements via XPath?

【讨论】:

以上是关于为啥 XPath 表达式只选择第一个元素的文本?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 XPath 选择文本不起作用?

XPath路径表达式笔记(转载)

为啥 jQuery 选择器只选择特定网站上的第一个层次结构元素?

Xpath路径表达式

XPath根据兄弟/堂兄文本选择元素?

XPath 选择下拉列表中的第一个元素