使用 bash 中的 xmllint 将 XML 文件中 table 的两个字段转换为 CSV?
Converting two fields of a table in an XML file into CSV using xmllint in bash?
我有一个 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 实现这个的方法吗?
这是使用 xmllint 的一种方法
xmllint --html --xpath '//tr/td[@data-title="Date"] | //tr/td[@data-title="Version"]' test.html | sed -re 's%(</[^>]+>)%\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。
我有一个 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 实现这个的方法吗?
这是使用 xmllint 的一种方法
xmllint --html --xpath '//tr/td[@data-title="Date"] | //tr/td[@data-title="Version"]' test.html | sed -re 's%(</[^>]+>)%\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。