Невозможно проанализировать XML в оболочке - PullRequest
0 голосов
/ 03 августа 2020

Итак, ниже мой xml Я пытаюсь разобрать. Сначала я использовал XmlSlurper в своем Jnekinsfile, разбор был простым, но я столкнулся с проблемами производительности в конвейере. Теперь я использую XMLlint, но это не так просто, как XmlSlurper: (

<metadata modelVersion="1.1.0">
  <groupId>com.test.test.test</groupId>
  <artifactId>myApp-ear</artifactId>
  <version>4.0.0-10-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20200803.052228</timestamp>
      <buildNumber>3</buildNumber>
    </snapshot>
    <lastUpdated>20200803052228</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>ear</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>

Я хочу проанализировать и получить значение <value>4.0.0-10-20200803.052228-3</value> из <snapshotVersion> with <extension> type ear .

Это мой фрагмент кода,

 $(xmllint --xpath "/metadata/artifactId/text()"
 metadataFile)-$(xmllint --xpath
 "/metadata/versioning/snapshotVersions[0]/value/text()"
 metadataFile).$(xmllint --xpath
 "/metadata/versioning/snapshotVersions[0]/extension/text()"
 metadataFile)

Вывод:

++ xmllint --xpath '/ metadata / artifactId / text () 'metadataFile ++ xmllint --xpath' / metadata / versioning / snapshotVersions [0] / value / text () 'metadataFile Набор XPath пуст ++ xmllint --xpath' / metadata / versioning / snapshotVersions [0] / extension / text () 'metadataFile Набор XPath пуст

Пожалуйста, помогите.

Заранее спасибо :)

1 Ответ

0 голосов
/ 03 августа 2020

Столкнувшись с такой ошибкой, я обычно начинаю пытаться сократить свое выражение xpath, пока не выясню, откуда я получаю неожиданные данные. Ваши полные выражения:

/metadata/versioning/snapshotVersions[0]/value/text()

Это возвращает пустой набор. Если мы попробуем вместо этого:

/metadata/versioning/snapshotVersions

Мы увидим, что это возвращает:

<snapshotVersions>
      <snapshotVersion>
        <extension>ear</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
    </snapshotVersions>

Отлично! Но если мы добавим к этому [0], мы снова получим пустой набор:

$ xmllint --xpath '/metadata/versioning/snapshotVersions[0]' metadata.xml
XPath set is empty

Для этого есть две причины:

  1. Вам нужно применить Оператор [n] для элементов, составляющих список (так, snapshotVersion, а не snapshotVersions), и

  2. Xpath начинает перечисление элементов с 1, а не 0.

Кажется, это делает то, что вы хотите:

$ xmllint --xpath '/metadata/versioning/snapshotVersions/snapshotVersion[1]/value/text()' metadata.xml
4.0.0-10-20200803.052228-3
...