Преобразование двух полей таблицы в файле XML в CSV с использованием xmllint в bash? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть XML-файл (преобразованный из HTML), содержащий такие поля:

<tr>
  <td data-title="Date">2018-01-01</td>
  <td data-title="Version"><a href="https://some-link">25.1</a></td>
</tr>
<tr>
  <td data-title="Date">2018-03-01</td>
  <td data-title="Version"><a href="https://some-link">24.1</a></td>
</tr>

Я использовал 'xmllint' для извлечения отдельных значений:

textarea=$(echo "$xml" | xmllint --xpath 'string(//*[@id="content"])' 2>/dev/null )

и несколько значений:

list=$(echo "$xml" | xmllint --xpath 'string(/html/body/div/ul)' 2>/dev/null )

но теперь я хочу извлечь два поля из каждой записи, в формате CSV или что-то подобное.

Самое близкое, что у меня есть, это:

xpath tr/*[@data-title="Date" or @data-title="Version"]/text()
Object is a Node Set :
Set contains 20 nodes:
1  TEXT
    content=Apr 9, 2018 6:13 PM UTC
2  TEXT
    content=Mar 21, 2018 10:41 PM UTC
3  TEXT
    content=Mar 19, 2018 9:22 PM UTC

Можете ли вы показать мне способ добиться этого с помощью лучшего xpath?

1 Ответ

0 голосов
/ 28 апреля 2018

Это способ использовать xmllint

xmllint --html --xpath '//tr/td[@data-title="Date"] | //tr/td[@data-title="Version"]' test.html | sed -re 's%(</[^>]+>)%\1\n%g'

Выход:

<td data-title="Date">2018-01-01</td>
<td data-title="Version"><a href="https://some-link">25.1</a></td>
<td data-title="Date">2018-03-01</td>
<td data-title="Version"><a href="https://some-link">24.1</a></td>
  • Добавить --html параметр для ввода html-сигнала
  • Добавьте // в xpath для поиска относительных путей. Ваш xpath не имеет косой черты в начале, так что xpath относительно текущего узла. В оболочке xmllint, которая связана с тем, как вы использовали команду cd.
  • Наконец, используйте оператор | для поиска двух или более путей xpath.
...