我有一个类似于这样的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查询。
答案 0 :(得分:2)
这个XPath,
//*[SHORT-NAME='Element3']
将选择所有元素,无论其名称如何,其中SHORT-NAME
子元素的字符串值为Element3
。
如果您希望指定目标元素的遗产,请根据需要向上扩展模式:
//*[SHORT-NAME='Element1']//*[SHORT-NAME='Element2']//*[SHORT-NAME='Element3']