更正Awk表达式以将xml解析为csv

更正Awk表达式以将xml解析为csv,xml,csv,awk,Xml,Csv,Awk,我写了一个表达式来将我的xml解析为CSV,但它不起作用,请帮我一下。我这样做是因为我不能在服务器上使用像xmlstarlet这样的解析器 这是我的xml <?xml version="1.0"?> <root> <record> <country>US</country> <data> <id_client>50C</id_client>

我写了一个表达式来将我的xml解析为CSV,但它不起作用,请帮我一下。我这样做是因为我不能在服务器上使用像xmlstarlet这样的解析器

这是我的xml

<?xml version="1.0"?>
<root>
  <record>
   <country>US</country>  
  <data>
            <id_client>50C</id_client>  
            <mail>1@mail.com</mail>
            <adress>10  </adress>
            <num_tel>001</num_tel>
            <name>toto</name>
            <birth>01/30/008</birth>        
  </data> 
  <data>
            <id_client>100K</id_client>  
            <mail>2@mail.com</mail>
            <adress>10  </adress>
            <num_tel>002</num_tel>
            <name>toto2</name>
            <birth>01/30/011</birth>                    
  </data> 
 </ record>
 <record>
   <country>China</country>  
  <data>
            <id_client>99E</id_client>  
            <mail>3@mail.com</mail>
            <adress>10  </adress>
            <num_tel>003</num_tel>
            <name>toto3</name>
            <birth>01/30/0008</birth>       
  </data> 
  <data>
            <id_client>77B</id_client>  
            <mail>4@mail.com</mail>
            <adress>10  </adress>
            <num_tel>004</num_tel>
            <name>toto4</name>
            <birth>2001/05/01</birth>                   
  </data> 
  </record
  </root>
最后,我要更新的语法是:

/<country>/{sub(".*<country[^>]+><[^>]+>","",$0);sub("<.*","",$0);s=s";"$0}/<\/country>/{sub("^;","",s);print s;s=""}

/{sub(“.*]+>]+>”,“,$0”);sub(“如果您是数据,则总是像您显示的那样,每行放置一个条目,没有奇怪的空白:

$ cat tst.awk
BEGIN {
    FS="[><]"; OFS=";"
    n = split("country id_client name",tags,/ /)
    for (i=1; i<=n; i++) {
        printf "%s%s", tags[i], (i<n?OFS:ORS)
    }
 }
{ tag2val[$2] = $3 }
/<\/data>/ {
    for (i=1; i<=n; i++) {
        printf "%s%s", tag2val[tags[i]], (i<n?OFS:ORS)
    }
}

$ awk -f tst.awk file
country;id_client;name
US;50C;toto
US;100K;toto2
China;99E;toto3
China;77B;toto4
$cat tst.awk
开始{

FS=“[>服务器上有perl吗?或者python?或者ruby?其中任何一种都更适合此任务(支持实际的xml)那么awk就是了。@EtanReisner也有一个用于gawk的XML库。请参阅和。注意:我从未使用过它,所以我所知道的就这些了。@EdMorton感谢您提供的链接。我知道我以前看过它,但在我想引用它的时候却一直找不到它。太好了,太好了!谢谢您。我越来越了解拆分的重要性awk中的ial
$ cat tst.awk
BEGIN {
    FS="[><]"; OFS=";"
    n = split("country id_client name",tags,/ /)
    for (i=1; i<=n; i++) {
        printf "%s%s", tags[i], (i<n?OFS:ORS)
    }
 }
{ tag2val[$2] = $3 }
/<\/data>/ {
    for (i=1; i<=n; i++) {
        printf "%s%s", tag2val[tags[i]], (i<n?OFS:ORS)
    }
}

$ awk -f tst.awk file
country;id_client;name
US;50C;toto
US;100K;toto2
China;99E;toto3
China;77B;toto4