伪XML到CSV

时间:2017-08-04 13:37:58

标签: xml bash

我有一个包含以下内容的文件:

<AA>
  <BB>RANDOM TEXT1</BB>
  <BB>RANDOM TEXT2</BB>
</AA>
<AA>
  <BB>RANDOM TEXT3</BB>
  <BB>RANDOM TEXT4</BB>
</AA>
<AA>
  <BB>RANDOM TEXT5</BB>
  <BB>RANDOM TEXT6</BB>
</AA>

将其转换为CSV的最佳方法是:

RANDOM TEXT1,RANDOM TEXT2
RANDOM TEXT3,RANDOM TEXT4
RANDOM TEXT5,RANDOM TEXT6

1 个答案:

答案 0 :(得分:0)

解析XML的最佳方法是使用XML解析器。

第一步,将伪XML“修复”为正确的XML:

$ { echo '<root>'; cat file; echo '</root>'; }
<root>
<AA>
  <BB>RANDOM TEXT1</BB>
  <BB>RANDOM TEXT2</BB>
</AA>
<AA>
  <BB>RANDOM TEXT3</BB>
  <BB>RANDOM TEXT4</BB>
</AA>
<AA>
  <BB>RANDOM TEXT5</BB>
  <BB>RANDOM TEXT6</BB>
</AA>
</root>

然后,使用XML解析器提取BB值,此处使用

$ { echo '<root>'; cat file; echo '</root>'; } | xmlstarlet sel -t -v //BB
RANDOM TEXT1
RANDOM TEXT2
RANDOM TEXT3
RANDOM TEXT4
RANDOM TEXT5
RANDOM TEXT6

然后,加入线对

... | xmlstarlet sel -t -v '//BB' | paste -d, - -
RANDOM TEXT1,RANDOM TEXT2
RANDOM TEXT3,RANDOM TEXT4
RANDOM TEXT5,RANDOM TEXT6

可以使用xmlstarlet的选项完成,而不使用粘贴,但会牺牲可读性:

... | xmlstarlet sel -t -m //AA -v 'BB[1]' -o ',' -v 'BB[2]' -n
RANDOM TEXT1,RANDOM TEXT2
RANDOM TEXT3,RANDOM TEXT4
RANDOM TEXT5,RANDOM TEXT6