xpath选择父节点类型不同的子节点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xpath选择父节点类型不同的子节点相关的知识,希望对你有一定的参考价值。
我为可能误导性的标题道歉,我不知道该怎么说。
我有一个巨大的xml文件,里面有很多元素,我需要得到一个特定元素(名称为w:r),但前提是该元素不在另一个名为w:r的元素中
e.f.:
<w:r>
test
</w:r>
应该选择一个元素
<w:r>
<w:r>
test
</w:r>
</w:r>
还应该只选择一个元素(外部元素)而不是两个元素。
我目前的解决方案是://*[local-name()='r']
,但它为第二个例子选择了两个元素(一个是外部元素,另一个是内部元素)
答案
您可以使用以下XPath表达式提取外部w:r
元素:
//*[local-name()='r' and not(parent::*[local-name()='r'])]
对于以下XML(用于测试目的):
<?xml version='1.0' encoding='utf-8'?>
<root xmlns:w="xxx">
<w:r t="c">
test
</w:r>
<w:r t="d">
<w:r t="h">
test
</w:r>
</w:r>
<w:r t="e">
<a>
<b>
<c>...
<w:r t="i">Something</w:r>
...
</c>
</b>
</a>
</w:r>
</root>
输出是:
<w:r xmlns:w="xxx" t="c"/>
<w:r xmlns:w="xxx" t="d"/>
<w:r xmlns:w="xxx" t="e"/>
这意味着表达式选择了所有外部w:r
元素。
如果您想考虑所有父母而不仅仅是直接父母,您可以像这样使用ancestor::
轴:
//*[local-name()='r' and not(ancestor::*[local-name()='r'])]
对于示例XML,结果是相同的,但语义是不同的。
以上是关于xpath选择父节点类型不同的子节点的主要内容,如果未能解决你的问题,请参考以下文章