簡體   English   中英

Bash shell XML 至 CSV

[英]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 示例

給定一個 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

太糟糕了,你不能安裝其他工具: 可以很容易地按照你喜歡的方式格式化你的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM