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 命令从特定国家/地区获得 Capacityhotels。 条件是这样的—— 在 ** 国家 = 印度,城市 = 孟买,酒店 = 万豪**

可能会有更多的国家和城市在其中使用相同的酒店名称。

我做的是

//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 命令为子元素和孙元素提供条件的主要内容,如果未能解决你的问题,请参考以下文章

将元素添加为子视图后,元素位置发生变化

将列表的元素分组为子列表(可能使用番石榴)

PHP - 当给定子键名时,递归地将每个数组元素的键设置为子元素的值

如何将列表中的连续元素拆分为子列表

XPath 获取除具有特定名称的子元素之外的所有子元素?

XPath 查找子元素的父元素