通过XPath

时间:2017-10-31 11:56:53

标签: java xml dom xpath

我有一个类似于这样的XML文件:

<PACKAGES>
    <PACKAGE>
        <SHORT-NAME>Element1</SHORT-NAME>
        <PACKAGES>
            <PACKAGE>
                <SHORT-NAME>Element2</SHORT-NAME>
                <ELEMENTS>
                    <MODULE>
                        <SHORT-NAME>Element3</SHORT-NAME>
                        <DESC>
                        </DESC>
                        <CATEGORY>Item</CATEGORY>
                    </MODULE>
                </ELEMENTS>
            </PACKAGE>
        </PACKAGES>
    </PACKAGE>
</PACKAGES>

我希望能够使用&#34; Element3&#34;的SHORT-NAME为MODULE元素构建一个XPath查询,基于&#34; Element3&#34;&#39的简短名称;父母......所以这样的事情:

//SHORT-NAME='Element1'.//SHORT-NAME='Element2'.//SHORT-NAME='Element3'

我已经尝试过上述查询,但它似乎不起作用,而不是有效的查询。我也试过这个:

//*[text()='Element1']//*[text()='Element2'] etc...

但同样,这似乎不是一个有效的查询。

我希望这是可扩展的,以便特定查询可以是任何路径,但路径始终基于SHORT-NAME的文本值。

类似于:

/Element1/SubElement2/SubSubElement3/SubSubSubElement4 
也可以查询

一个重要的注意事项:对于上面的查询,我只想要Element3 IF它是Element2的子节点,它是Element1的子节点。 IF Element3存在于文档的其他位置,我不想要那个节点。

我希望这是可能的,我只是没有建立正确的查询,但我对如何搜索此主题以试图找到答案感到茫然。

编辑: Andersson提供的答案几乎100%适用于我的用例。问题如下:

如果我仍然需要查询/ Element1 / Element2 / Element3,但我的XML如下所示:

<PACKAGES>
    <PACKAGE>
        <SHORT-NAME>Element1</SHORT-NAME>
        <PACKAGES>
            <PACKAGE>
                <SHORT-NAME>Element2</SHORT-NAME>
                <ELEMENTS>
                    <PACKAGE>
                    <SHORT-NAME>RandomElement</SHORT-NAME>
                        <MODULE>
                            <SHORT-NAME>Element3</SHORT-NAME>
                            <DESC>
                            </DESC>
                            <CATEGORY>Item</CATEGORY>
                        </MODULE>
                    </PACKAGE>
                </ELEMENTS>
            </PACKAGE>
        </PACKAGES>
    </PACKAGE>
</PACKAGES>

仍然返回Element3,但Element3的父级不是Element2。这使事情变得更复杂,我怀疑我需要创建一个系统地搜索下一个子SHORT-NAME的函数,并检查for查询是否满足。除非可以以满足上述用例的方式修改XPath查询。

1 个答案:

答案 0 :(得分:2)

这个XPath,

//*[SHORT-NAME='Element3']

将选择所有元素,无论其名称如何,其中SHORT-NAME子元素的字符串值为Element3

如果您希望指定目标元素的遗产,请根据需要向上扩展模式:

//*[SHORT-NAME='Element1']//*[SHORT-NAME='Element2']//*[SHORT-NAME='Element3']