我有一个看起来像这样的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>


我希望能够基于“ Element3”的父代的SHORT-NAMES来构建具有“ Element3”的简称的XDU查询到MODULE元素...

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


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

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


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

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

所以像这样:

/Element1/SubElement2/SubSubElement3/SubSubSubElement4


也可以查询。

重要说明:对于上面的查询,如果它是Element2的子代,而Element2是Element1的子代,则只需要Element3。如果Element3在文档的其他位置存在,则我不希望该节点。

我希望这是可能的,我只是没有建立正确的查询,但是我对于如何甚至搜索该主题以尝试找到答案一无所知。

编辑:下面由安德森提供的答案几乎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查询。

最佳答案

这个XPath

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


将选择所有具有SHORT-NAME子元素且字符串值为Element3的元素(无论其名称如何)。

如果要指定目标元素的传统,请根据需要向上扩展图案的层次:

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

10-08 04:56