我正在使用javax XPath从一些xml中提取一个值,该值可以以两种格式之一从服务返回(不要问我原因),如下所示:
[Mar Hrs]
或
<item>
<attrQualOptMany name="someName">
<value>someValueICareAbout</value>
<value qual="101">someValueICareAbout</value>
</attrQualOptMany>
</item>
是否有单 XPath表达式可以采摘
<item>
<attr name="someName">someValueICareAbout</attr>
</item>
来自
someValueICareAbout
两种情况下的元素?由于我不知道将提前返回哪种xml格式,因此我总是必须通过针对item元素评估两个XPath表达式来解析该值,如下所示。实际上,该项目的几个属性可以以任何一种形式存在,我宁愿不在我的代码中使用大量if-else块来提取它们,如果可能的话:
<item></item>
答案 0 :(得分:1)
只需在xpath中使用OR语句并选择第一个结果。
//attrQualOptMany[@name='someName']/value/text()|//attr[@name='someName']/text()
我使用样本输入
测试了上述语句<items>
<item>
<attrQualOptMany name="someName">
<value>someValueICareAbout</value>
<value qual="101">someValueICareAbout</value>
</attrQualOptMany>
</item>
<item>
<attr name="someName">someValueICareAbout</attr>
</item>
</items>
on http://www.freeformatter.com/xpath-tester.html#ad-output
它工作正常(返回3个结果)。请务必仅返回第一个结果(并停止检查文档的其余部分)。返回所有匹配元素(然后选择第一个元素)将是浪费。
答案 1 :(得分:1)
String eval = "attrQualOptMany[@name='someName']/value/text() | attr[@name='someName']/text()"
String value = xpath.compile(eval).evaluate(itemElement, XPathConstants.STRING);