Como converter multi level xml para uma única linha contendo todos os níveis usando XMLSTARLET

2

O exemplo de XML é assim:

<?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>

A saída desejada é semelhante a:

AAAAAA,BBBBB, CCCCCCCCCCCCC ,DDDDDDDDDD ,DDD,EEE,FFF,GGGG,HHH,III,JJJ,KKK,L
    
por sdfsdf 07.07.2016 / 12:13

2 respostas

1

Usando xml2 (disponível para o debian e a maioria das outras distribuições) em vez de xml2starlet , junto com awk e paste :

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

se você quiser espaços após cada vírgula, adicione-os com sed :

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

cut também pode funcionar no lugar de awk , mas acredito que há outros critérios que você não mencionou ainda, por isso vou continuar com awk por enquanto. Enfim, aqui está a versão cut :

xml2 <sdfsdf.xml | cut -d= -f2 | paste -sd,
    
por 07.07.2016 / 12:53
1
Os argumentos

xmlstartlet são um pouco complicados. Tens de ver eles como templtes (-t) da maneira xsl ...

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

onde:

  • -B: remover genericamente espaços
  • -t: modelo no sentido xsl
  • -m: corresponde ao xpath exp
  • -c: cópia do xpath exp

Esta expressão produz um extra ",". Naturalmente podemos usar normal Ferramentas Unix para ajudar:

xmlstarlet sel -B -t -v '//text()' x1.xml | 
    sed -z 's/\n/, /g; s/$/\n/'
  • -t: um modelo (no sentido xsl)
  • -v: valor-de (expressão xpath)
  • sed ... para aparar,
por 26.10.2016 / 09:40

Tags