是否有一个XPath表达式可以从两个不同的位置获取值?

时间:2017-03-17 20:55:14

标签: java xpath

我正在使用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>

2 个答案:

答案 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);