Неверное выражение XPath: ожидание токена - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующая полезная нагрузка 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 elemtn с 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 ]

3 голосов
/ 05 апреля 2019

Как указывается в сообщении об ошибке, за / должен следовать шаг местоположения. Следовательно, /[@class = 'standard' ...] не является допустимым выражением xPath.

Вместо этого попробуйте:

/product/discount[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']
1 голос
/ 09 апреля 2019

Просто для удовольствия, более короткое выражение XPath 1.0, чем у @jsheeran, отличный ответ:

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

Если атрибут class является уникальным токеном и какой-то специальный символ (например, &#x20;) не может быть его частью, то вы можете использовать этот XPath 1.0 «элемент IN sequence» выражение:

/product
   /discount[
      contains(
         ' standard special customer sale ',
         concat(' ',@class,' ')
      )
   ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...