【问题标题】:Get XML node based on heritage of element values根据元素值的继承获取 XML 节点
【发布时间】:2018-04-13 16:28:31
【问题描述】:
<XXX>
    <SHORT-NAME>ELEMENT1</SHORT-NAME>
    <YYY>
        <ZZZ>
            <SHORT-NAME>ELEMENT2</SHORT-NAME>
            <AAA>
                <BBB>
                    <SHORT-NAME>ELEMENT3</SHORT-NAME>
                    <CCC></CCC>
                    <DDD></DDD>
                    <EEE></EEE>
                    <FFF>
                        <SHORT-NAME>ELEMENT4</SHORT-NAME>
                    </FFF>
                    <GGG>
                        <SHORT-NAME>ELEMENT6</SHORT-NAME>
                    </GGG>
                </BBB>
                <HHH>
                    <SHORT-NAME>ELEMENT5</SHORT-NAME>
                </HHH>
            </AAA>
        </ZZZ>
    </YYY>
</XXX>

这个想法是每个 ELEMENT(s) 代表一个包或容器,每个子元素代表它的父元素的一个子元素或包。这些包是根据它们的 SHORT-NAME 命名的。在一个元素和它的子包之间可以有任意数量的元素。这个 XML 文件是提供给我的,我没有更改它的意见,因为这个布局定义明确。

“其他”在上述 XML 中对各种元素进行寻址的方式是基于它们相对于其父级的位置并由其 SHORT-NAME 寻址。因此,例如,在上面的示例中,/ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT4 是基于它的 SHORT-NAME 来寻址 &lt;FFF&gt; 元素的有效方法。另一方面,/ELEMENT1/ELEMENT2/ELEMENT4 之类的内容不是解决 ELEMENT4 的有效方法,因为 ELEMENT4 在技术上是 ELEMENT3 的“子代”。

所以我昨天发布了一个关于如何使用 XPath 根据它们的 SHORT-NAME 检索某些元素的问题,并且提出的解决方案是这样的:

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT3']//*[SHORT-NAME='ELEMENT4']

这将在上面的示例中起作用,但是问题在于,如果我改为使用这样的 XPath:

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//[SHORT-NAME='ELEMENT4']

它仍然会检索 ELEMENT4,并且 实际上如果有人不知道他们需要的元素的确切路径/层次结构,他们应该无法检索它。这是一个关键点。

我希望这可以通过 XPath 查询来解决。

【问题讨论】:

  • 你的意思是所有带有SHORT-NAME子的节点必须在XPath中被提及?
  • 在上面的示例中,ELEMENT4 和 ELEMENT6 将被视为“兄弟姐妹”,它们的“父级”是 ELEMENT3。因此,要解决 ELEMENT4 或 ELEMENT6,您需要 /ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT4 或 /ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT6。只有那些路径可以寻址这些节点。
  • 看来他能够从我的答案中获得所需的信息,因为他提出的以下解决方案有效。感谢您的帮助。

标签: java xml dom xpath


【解决方案1】:

你可以尝试如下使用:

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT3']//*[SHORT-NAME='ELEMENT4' and count(./ancestor-or-self::*[./SHORT-NAME])=4]

这个想法是手动指定路径中提到的节点数(在提供的示例中为"4")。只有在路径中提到了所有具有 SHORT-NAME 子节点的祖先时,表达式才会返回您想要的节点,所以

//*[SHORT-NAME='ELEMENT1']//*[SHORT-NAME='ELEMENT2']//*[SHORT-NAME='ELEMENT4' and count(./ancestor-or-self::*[./SHORT-NAME])=3]

不应返回您所需的节点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多