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?

Foi útil?

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 -d0` 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top