[英]Bash shell XML to CSV
我必須使用 xmllint --shell 或 xmllint --xpath 將 xml 解析為 csv,因為我不允許安裝其他軟件包。
我需要 csv 中的名字和電話,僅此而已。 我嘗試循環遍歷 xml 並將其解析為 csv 文件,但問題是當名字有空格(例如 Mary Jane)或電話丟失時。 那么這種解決方案是行不通的。
for f in $(echo 'cat //FIRSTNAME/text()' | xmllint --shell TEST.xml | sed '1d;$d' | sed 's/-------//')
do
echo $f >> $CSV_FILE_NAMES
done
for i in $(echo 'cat //HOMEPHONE/text()' | xmllint --shell TEST.xml | sed '1d;$d' | sed 's/-------//')
do
echo $i >> $CSV_FILE_PHONES
done
paste -d "," $CSV_FILE_NAMES $CSV_FILE_PHONES >> $CSV
或者這個組合解決方案,它將每個實體放在一個新行中:
for f in $(echo 'cat //FIRSTNAME/text()|//HOMEPHONE/text()' | xmllint --shell TEST.xml | sed '1d;$d' | sed 's/-------//')
do
echo $f >> $CSV_FILE
done
Mark
9999999999
Jack
8888888888
是否有不同的方法來遍歷 xml 文件?
給定一個 XML 文件file.xml
<PEOPLE>
<PERSON>
<FIRSTNAME>Alice</FIRSTNAME>
<HOMEPHONE>555-1212</HOMEPHONE>
</PERSON>
<PERSON>
<FIRSTNAME>Bob</FIRSTNAME>
<HOMEPHONE>123-4567</HOMEPHONE>
</PERSON>
</PEOPLE>
然后
echo 'cat (//FIRSTNAME | //HOMEPHONE)/text()' | xmllint --shell file.xml
輸出
/ > -------
Alice
-------
555-1212
-------
Bob
-------
123-4567
/ >
這很容易用 awk 和其他工具解析:
echo 'cat (//FIRSTNAME | //HOMEPHONE)/text()' | xmllint --shell file.xml | awk '
NR % 4 == 2 {printf "%s,", $0}
NR % 4 == 0 {print $0}
'
Alice,555-1212
Bob,123-4567
太糟糕了,你不能安裝其他工具: xmlstarlet可以很容易地按照你喜歡的方式格式化你的 output:
xmlstarlet sel -t -m //PERSON -v ./FIRSTNAME -o , -v ./HOMEPHONE -n file.xml
Alice,555-1212
Bob,123-4567
在您提供的XML中,我認為在所有ZVM_DATA上循環會更簡單,然后使用ZB6454D498635710A189189184EA13BEED1C1C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C11C118NFENTENTENTENTENTENTEATENTEATENTEATENTEATENTEATENTEANTEATENTEANTEATENTERYETENE
for index in $(seq $(xmllint --xpath "count(//ZVM_DATA)" test.xml))
do
xmllint --xpath "concat(//ZVM_DATA[$index]/FIRSTNAME/text(),',',//ZVM_DATA[$index]/HOMEPHONE/text())" --format test.xml
done
它不是最干凈的,但不幸的是, xmllint僅支持 Xpath 1.0,否則可以在一個命令中完成。
編輯:結果應該是這樣的:
Michael ,7800002814
E,7800907671
Ryan,7909355223
您可以通過以下方式使用awk
awk 'BEGIN{FS="[<|>]"} /FIRSTNAME/ { v1=$3 } /HOMEPHONE/ { v2=$3 } /\/ZVM_DATA/ {printf "%s, %s\n", v1, v2}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.