XPath表达式无效:需要令牌

时间:2019-04-05 10:08:47

标签: java xpath

我有以下XML有效负载:

<?xml version="1.0" encoding="UTF-8" ?>
<product>
  <discount class="standard">
    <id>123</id>
    <beginDate>20181205</beginDate>
    <endDate>20181225</endDate>
  </discount>
  <account>12345</account>
</product>

class元素上的discount属性可以具有以下值:

  • standard
  • special
  • custom
  • sale

我正在尝试编写一个XPath表达式,如果该文件具有product/discount元素且其中一个值为class,则该表达式将匹配。我的最佳尝试:

/product/discount[@class]/[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']

产生以下错误:

InvalidXPathExpression: Invalid xpath: /product/discount[@class]/[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']. Reason: javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: A location step was expected following the '/' or '//' token.

有什么想法可以解决我的XPath问题吗?

2 个答案:

答案 0 :(得分:3)

如错误消息所指示,/之后必须执行定位步骤。因此,/[@class = 'standard' ...]不是有效的xPath表达式。

相反,请尝试:

/product/discount[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']

答案 1 :(得分:1)

只是为了好玩,它的XPath 1.0表达式比@jsheeran更好的答案要短:

/product/discount[@class[.='standard' or .='special' or .='customer' or .='sale']]

如果class属性是唯一标记,并且某些特殊字符(例如&#x20;)不能包含在其中,那么您可以使用此XPath 1.0 “项目输入序列” 表达式:

/product
   /discount[
      contains(
         ' standard special customer sale ',
         concat(' ',@class,' ')
      )
   ]