我有一个 xml,我想将其解析为 csv,就像我开始使用 awk 一样,我想继续使用它,但我知道可以使用像 perl 这样的语言来完成它,我也找到了 xmlstarlet,但我没有有权在服务器上安装,所以我对解决方案持开放态度。所以我的 iinput xml 是
<?xml version="1.0"?>
<root>
<record>
<id_client>50C</id_client>
<data>
<mail>1@mail.com</mail>
<adress>10 </adress>
<num_tel>001</num_tel>
<key>C</key>
<contact>
<name>toto</name>
<birth>01/30/009</birth>
<city>London</city>
</contact>
</data>
<data>
<mail>2@gmaiil.com</mail>
<adress>20</adress>
<num_tel>02200</num_tel>
<key>D1</key>
<contact>
<name>tata</name>
<birth>02/08/2004</birth>
<city>Bruges</city>
</contact>
</data>
</record>
<record>
<id_client>70D</id_client>
<data>
<mail>3@gmail.com</mail>
<adress>7Bcd</adress>
<num_tel>5555</num_tel>
<key>D2</key>
<contact>
<name>titi</name>
<birth>05/07/2014</birth>
<city>Paris</city>
</contact>
</data>
<data>
<mail>4@gmail.com</mail>
<adress>888</adress>
<num_tel>881.0</num_tel>
<key>D3</key>
<contact>
<name>awk</name>
<birth>05/08/1999</birth>
<city>Lisbone</city>
</contact>
</data>
Run Code Online (Sandbox Code Playgroud)
我想与听众一起输出这个 csv 文件
id_client;mail;num_tel;key
50C;1@mail.com;001;C
50C,2@gmail.com;02200;D1
70D;3@gmail.com;5555;D2
70D;4@gmail.com;881.0;D3
Run Code Online (Sandbox Code Playgroud)
给出这个答案是为了说明从问题描述中显示的特定 .xml 格式中提取信息的基于文本的过程(相同的 .xml 可以采用不同的格式 - 例如没有换行 - 使得此处描述的过程不合适) 。
如果可能,请使用 XML 特定的工具,如xmllint。
基于文本的一行:
cat input.xml | grep -e \<mail\> -e \<adress\> -e \<num_tel\> -e \<key\> | sed 's/<[^>]*>//g' | sed 's/^\s*//g; s/\s*$//g' | paste -d ";" - - - -
Run Code Online (Sandbox Code Playgroud)
解释:
cat input.xml)grep)sed)sedAgain;单个 sed 命令中的两个表达式:一个用于前导空格,一个用于后续空格)paste)逐行解析 XML 时会遇到很多问题:XML 不是面向行的数据格式。
使用特定于 XML 的工具。这是多么简单:
xmlstarlet sel -t \
-m / -o "id_client;mail;num_tel;key" -n -b \
-m /root/record/data -v ../id_client -o ";" -v mail -o ";" -v num_tel -o ";" -v key -n \
file.xml
Run Code Online (Sandbox Code Playgroud)
id_client;mail;num_tel;key
50C;1@mail.com;001;C
50C;2@gmaiil.com;02200;D1
70D;3@gmail.com;5555;D2
70D;4@gmail.com;881.0;D3
Run Code Online (Sandbox Code Playgroud)