XPath 命令为子元素和孙元素提供条件
Posted
技术标签:
【中文标题】XPath 命令为子元素和孙元素提供条件【英文标题】:XPath command to give conditions for child and grandchild elements 【发布时间】:2021-08-06 15:40:51 【问题描述】:我想在 Java 中使用 XPath 从 XML 文件中获取特定节点值
<country>
<countryName>India</countryName>
<city>
<name>Mumbai</name>
<hotel>
<hotelName>Marriott</hotelName>
<capacity>500</capacity>
</hotel>
<hotel>
<hotelName>ITC</hotelName>
<capacity>400</capacity>
</hotel>
</city>
<city>
<name>Bangalore</name>
<hotel>
<hotelName> ITC</hotelName>
<capacity>250</capacity>
</hotel>
</city>
</country>
<country>
<countryName>Australia</countryName>
<city>
<name>Sydney</name>
<hotel>
<hotelName>Marriott</hotelName>
<capacity>200</capacity>
</hotel>
</city>
</country>
现在我想要使用 xpath 命令从特定国家/地区获得 Capacity 的 hotels。 条件是这样的—— 在 ** 国家 = 印度,城市 = 孟买,酒店 = 万豪**
可能会有更多的国家和城市在其中使用相同的酒店名称。
我做的是
//country[normalize-space(name)="India" and normalize-space(city/name)="Mumbai" and normalize-space(city/hotel)="Marriott"]/city/capacity/text()
但这为我提供了印度国内所有酒店容量的输出!
请帮忙看一下命令,我不知道我哪里出错了或者我应该改变什么
【问题讨论】:
请注意,您的示例输入/xpath 中有两个拼写错误。有一个不正确关闭的酒店节点,示例 xpath 引用国家“名称”节点而不是“国家名称”。 谢谢,我已经改正了 【参考方案1】:您方法中的谓词(方括号中的条件)是根据子/孙节点的存在选择一个国家/地区,然后选择该国家/地区内的所有城市/容量。如果您始终打算针对单个特定酒店,则将谓词与层次结构的每个级别相关联,例如:
//country[normalize-space(countryName)="India"]/city[normalize-space(name)="Mumbai"]/hotel[normalize-space(hotelName)="Marriott"]/capacity/text()
返回 500。这将为在名为“印度”的国家/地区中名为“孟买”的城市中名为“万豪”的酒店选择容量文本。
【讨论】:
对于我使用它的 xml,我不能像那样硬编码它,因为 xml 不会相同,但结构会相似!如何编写具有相同条件但对条件不那么具体的命令(不是硬编码)?? 这与您提出的问题完全不同。您尚未共享有关如何构建 XPath 的任何信息。 XPath 本身没有变量,因此您需要使用 XQuery 或任何可以动态构建 XPath 的脚本/编程语言。我回答了您直接提出的问题(为什么您的显式 XPath 没有返回您的预期结果)。 是的,是的,你回答了我的问题!除了那个问题,我还在评论中问你这个问题,因为我看到你在这方面比我有很多知识。我将检查 XQuery 或其他动态构造 xpath 的方法。我无法硬编码,因为我从实时服务器接收 xml 文件,并且并非所有元素更改都可能每次都反映。此 xml 是一个示例,而不是真实的。 实际上,大约有 100 个这样的元素具有完全不同的名称但结构相同,所以我正在寻找一种方法来编写通用代码行,该代码行从文件中获取元素名称并自动构造这样的命令。但是子孙节点的数量是可变的以上是关于XPath 命令为子元素和孙元素提供条件的主要内容,如果未能解决你的问题,请参考以下文章