根据元素值的遗产获取XML节点

时间:2017-11-01 11:05:12

标签: java xml dom xpath

<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各自代表一个包或容器,每个子元素代表它的父元素的子元素或包。包根据其SHORT-NAME命名。元素及其子包之间可以有任意数量的元素。这个XML文件提供给我,我没有输入更改它,因为这个布局定义得很好。

“其他人”处理上述XML中的各种元素的方式基于它们相对于其父级的位置,并由其SHORT-NAME解决。例如,在上面的示例中,/ELEMENT1/ELEMENT2/ELEMENT3/ELEMENT4是基于它的SHORT-NAME来解决<FFF>元素的有效方法。另一方面,像/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,而实际上如果有人不知道他们需要的元素的确切路径/ heiarchy,它们应该无法检索它。这是一个关键点。

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

1 个答案:

答案 0 :(得分: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]

不应该返回您所需的节点