XPath для всех значений атрибутов, а не только для первого?

Изменить: проблема в моем случае была вызвана инструментом, который не полностью реализует стандарт XPath. Моя попытка с //key@ должен был работать (см. комментарии и ответ), и причина, по которой он не работает, заключается в том, что инструмент показывает только первый результат.

Мой XML выглядит так:

<Document id="someIdhere" token="123-456-789" created-by="john_doe" created-at="2020-05-27T10:04:28.244+0000" last-modified-by="jane_doe" last-modified-at="2020-07-30T09:27:59.440+0000">
<somedata/>
<somemoredata/>
<entries>
    <entry key="resourceName">resourceLocation</entry>
    <entry key="foo">bar</entry>
    <entry key="somekey">somevalue</entry>
    <entry key="keyname">keyvalue</entry>
    <entry key="keyname1">value1</entry>
</entries>
<encryptedEntries/>
</Document>

Я ищу ценность всех keyатрибуты (например,'resourcename','foo' и т. д.); не ценность <entry>узлы. У меня нет возможности заранее узнать, сколько записей будет и каково будет содержимое.

Я пробовал следующее:

//@* -> дает все атрибуты, а не только key
//entries/@* -> ничего не возвращает
//entry@* -> ничего не возвращает
//@key -> возвращает только первый результат
//entries/key[*] -> ничего не возвращает
//entry@key -> ничего не возвращает
//entry@key=* -> ничего не возвращает

Я, наверное, пробовал и другие, но это то, что я помню. Если это имеет значение: XPath выполняется задачей XML Webhook в XLRelease Xebialabs.

1 ответ

Решение

@JaSON уже предоставил вам два жизнеспособных XPath в комментарии1:

  • //@key выберут все key атрибуты в документе.
  • //entry/@key выберут все key атрибуты entry элементы в документе.

Вы это прокомментировали //entry/@keyвозвращает только первое значение и списывает его на несоответствие инструмента / библиотеки. Поймите, что есть API-интерфейсы библиотеки, которые имеют разные вызовы для возврата первого выбранного элемента, а не для возврата всех выбранных элементов.

Вот объяснения каждой из сделанных вами попыток:

  • //@* выбирает все атрибуты в документе.
  • //entries/@* ничего не выбирает, потому что entries не имеет атрибутов.
  • //entry@* синтаксически неверен.
  • //@key выбирает все key атрибуты в документе, но см. примечание API выше.
  • //entries/key[*] выбирает все key дочерние элементы (из entries elements) хотя бы с одним дочерним элементом
  • //entry@key синтаксически неверен.
  • //entry@key=* синтаксически неверен.

1 Проголосует за его ответ, если он его разместит.

Другие вопросы по тегам