Como trabalhar corretamente com XML na linha de comando

Minhas armas favoritas da CLI: sed, awk, grepnão pode funcionar corretamente em conteúdo XML. Eis que encontrei uma nova adição xmlstarlet,. Tem sido minha ferramenta favorita para interrogar arquivos XML na linha de comando. Você pode bash funções de script em torno dele para criar ferramentas específicas para o seu terno.

Para contar <Person>elementos em record.xml:

xmlstarlet sel -t -v "count(//Person)"  record.xml

Este é apenas o começo de uma emocionante jornada de trabalho com XML. Posso contar quantos atributos um elemento possui. Posso transformar XML. Posso listar elementos com valores de atributos específicos.

Por exemplo, aqui está um script que chamei de elcount.shque me ajuda a ter uma ideia bastante rápida da estrutura de um XML:

#!/bin/sh
#

[ $# -eq 0 ] && return 1

TMP
=$(mktemp)
TMP2
=$(mktemp)
TMP3
=$(mktemp)
TMP4
=$(mktemp)
XML
=$1
xmlstarlet el
-u $XML > $TMP
while read x;do
xmlstarlet sel
-t -v "count(//$x)" -n $XML >> $TMP2
xmlstarlet sel
-t -m "//$x/@*" -v "name()" -n $XML | sort -u > $TMP4
count
=$(wc -l < $TMP4)
if ((count == 0));then
echo
>> $TMP3
else
if ((count <= 10));then
attrs
=$(tr 'n' ',' < $TMP4)
echo
"@:$count:${attrs%?}" >> $TMP3
else
echo
"@:$count:*" >> $TMP3
fi
fi
done < $TMP

paste $TMP $TMP2 $TMP3
| column -s $'t' -t
rm
-f $TMP $TMP2 $TMP3 $TMP4

O script elcount.shme permite interrogar e me dá uma ideia da estrutura geral do XML. Eu tenho muitos outros scripts personalizados construídos em torno xmlstarlet. O script acima precisa de um pequeno ajuste de 1 linha se o XML tiver um esquema personalizado.