【问题标题】:Is there a single XPath expression that can get a value from two different locations?是否有一个 XPath 表达式可以从两个不同的位置获取值?
【发布时间】:2017-03-17 20:55:14
【问题描述】:

我正在使用 javax XPath 从一些 xml 中提取一个值,该值可以从服务中以两种格式之一返回(不要问我为什么),如下所示:

<item>
    <attrQualOptMany name="someName">
        <value>someValueICareAbout</value>
        <value qual="101">someValueICareAbout</value>
    </attrQualOptMany>
</item>

<item>
    <attr name="someName">someValueICareAbout</attr>
</item>

是否有单个可以采摘的XPath表达式

someValueICareAbout 

来自

<item></item>

元素在任何一种情况下?因为我不知道会提前返回哪种 xml 格式,所以我总是必须通过针对 item 元素评估两个 XPath 表达式来解析值,如下所示。实际上,该项目的多个属性可以以任何一种形式存在,如果可能的话,我不希望在我的代码中使用大量 if-else 块来提取它们:

XPath xpath = XPathFactory.newInstance().newXPath();
Element itemElement;  //This element has already been populated by prior code
String value = xpath.compile("attrQualOptMany[@name='someName']/value/text()")
                    .evaluate(itemElement, XPathConstants.STRING);
if(value  == null || value .isEmpty()) {
    value = xpath.compile("attr[@name='someName']/text()")
                 .evaluate(itemElement, XPathConstants.STRING);
}

【问题讨论】:

    标签: java xpath


    【解决方案1】:
    String eval = "attrQualOptMany[@name='someName']/value/text() | attr[@name='someName']/text()" 
    String value = xpath.compile(eval).evaluate(itemElement, XPathConstants.STRING);
    

    【讨论】:

      【解决方案2】:

      只需在您的 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>
      

      http://www.freeformatter.com/xpath-tester.html#ad-output

      它工作正常(返回 3 个结果)。确保只返回第一个结果(并停止检查文档的其余部分)。返回所有匹配的元素(然后选择第一个)会很浪费。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2011-03-16
        相关资源
        最近更新 更多