为啥 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/*
另见
Testing text() nodes vs string values in XPath Explanation of the same effect withcontains()
我尝试通过以下方式退货
/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 表达式只选择第一个元素的文本?的主要内容,如果未能解决你的问题,请参考以下文章