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:値(x​​path式)
  • sed... トリム,

おすすめ記事