Retire comentários do arquivo XML e bastão
Pergunta
Eu tenho esse enorme arquivo XML que contém muitos comentários.
Qual é a "melhor maneira" de retirar todos os comentários e formatar o XML da linha de comando Linux?
Solução
você pode usar arrumado
$ tidy -quiet -asxml -xml -indent -wrap 1024 --hide-comments 1 tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<user username="qwerty" password="ytrewq" roles="manager-gui" />
</tomcat-users>
Outras dicas
Execute seu XML através de um transformação de identidade XSLT, com um modelo vazio para comentários.
Todo o conteúdo XML, exceto os comentários, será passado para a saída.
Para formatar a saída, defina a saída @indent = "sim":
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!--Match on Attributes, Elements, text nodes, and Processing Instructions-->
<xsl:template match="@*| * | text() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Empty template prevents comments from being copied into the output -->
<xsl:template match="comment()"/>
</xsl:stylesheet>
Você pode querer olhar para o xmllint
ferramenta. Tem várias opções (uma das quais --format
fará uma bela impressão), mas não consigo descobrir como remover os comentários usando esta ferramenta.
Além disso, confira Xmlstarlet, um monte de ferramentas de linha de comando para fazer o que você deseja com o XML. Então faça:
xml c14n --without-comments # XML file canonicalization w/o comments
EDITAR: OP eventualmente usou esta linha:
xmlstarlet c14n --without-comments old.xml > new.xml
Para arrumar algo simples como o server.xml do tomcat, eu uso
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"
Ou seja
function tidy() {
echo "$( cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")"
}
tidy server.xml
... Imprimirá o XML sem comentários.
Nota: Embora funcione razoavelmente bem para coisas simples, falhará com certos blocos CDATA e em algumas outras situações. Use -o apenas para scripts XML controlados que não precisam e nunca precisarão escapar de um único <--
ou -->
qualquer lugar!
Primeiro sed marks comentários de comentários e param com 0x0 caracteres, depois grep with -z
Trata 0x0 como o único delimitador de linha, procura por linhas começando com o comentário, é -V inverte o filtro, deixando apenas linhas significativas. Finalmente, tr -d
0` exclui todos esses 0x0 e, para polir, outro grep remove linhas vazias: pronto.
A melhor maneira seria usar um analisador XML para lidar com todos os casos de canto obscuros corretamente. Mas se você precisar de algo rápido e sujo, há uma variedade de soluções curtas usando regexes Perl o que pode ser suficiente.