使用bash中的xmllint将XML文件中的表的两个字段转换为CSV?

时间:2018-04-28 01:00:22

标签: xml bash xpath xmllint

我有一个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 :(得分:0)

这是一种使用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 shell上,与您使用cd命令的方式相关。
  • 最后,使用|运算符搜索两个或更多xpath。