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