如何使用 XMLSTARLET 将多级 xml 转换为包含所有级别的单行

如何使用 XMLSTARLET 将多级 xml 转换为包含所有级别的单行

示例 XML 如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
  <level01>
    <field01>AAAAAAAAAAAAAAAAAAAA</field01>
    <field02>BBBBBBBB</field02>
    <field03>CCCCCCCCCCCCCCCCCCCC</field03>
    <field04>DDDDDDDDDDDDDDDDDDDD</field04>
    <field05>DDD</field05>
    <level02>
      <field01>EEEEEEEEE</field01>
      <field02>FFF</field02>
      <field04>GGGGGGGGGGs</field04>
      <field05>HHH</field05>
      <level03>
        <field01>IIIIIIIII</field01>
        <field02>JJJ</field02>
        <field04>KKKKKKKKK</field04>
        <field05>L</field05>
      </level03>
    </level02>
  </level01>
</root>

所需的输出如下所示:

AAAAAA,BBBBB, CCCCCCCCCCCCC ,DDDDDDDDDD ,DDD,EEE,FFF,GGGG,HHH,III,JJJ,KKK,L

答案1

xmlstartlet争论有点棘手。您必须以 xsl 方式将它们视为模板 (-t)...

xmlstarlet sel -B -t -m '//text()' -c 'concat(.,",")' x1.xml

在哪里:

  • -B:一般删除空格
  • -t :xsl 意义上的模板
  • -m : 匹配 xpath exp
  • -c : xpath exp 的副本

该表达式会产生一个额外的“,”。当然,我们可以使用普通的 Unix 工具来帮助:

xmlstarlet sel -B -t -v '//text()' x1.xml | 
    sed -z 's/\n/, /g; s/$/\n/'
  • -t :模板(在 xsl 意义上)
  • -v :值(xpath 表达式)
  • sed...修剪,

答案2

使用XML2(可用于 debian 和大多数其他发行版)而不是xml2starlet, 以及awkpaste

$ xml2 <sdfsdf.xml | awk -F= '{ print $2 }' | paste -sd,
AAAAAAAAAAAAAAAAAAAA,BBBBBBBB,CCCCCCCCCCCCCCCCCCCC,DDDDDDDDDDDDDDDDDDDD,DDD,EEEEEEEEE,FFF,GGGGGGGGGGs,HHH,IIIIIIIII,JJJ,KKKKKKKKK,L

如果希望每个逗号后都有空格,请用以下方式添加sed

xml2 <sdfsdf.xml | awk -F= '{ print $2 }' | paste -sd, | sed -e 's/,/, /g'

cut也可以代替,awk但我猜还有其他标准你还没有提到,所以我awk现在坚持使用。无论如何,这是cut版本:

xml2 <sdfsdf.xml | cut -d= -f2 | paste -sd,

相关内容