Pregunta

Tengo este enorme archivo xml que contiene muchos comentarios.

¿Cuál es la "mejor manera" de eliminar todos los comentarios y formatear correctamente el xml desde la línea de comandos de Linux?

¿Fue útil?

Solución

puede utilizar ordenada

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

Otros consejos

Ejecute su XML a través de un transformación de identidad XSLT, con una plantilla vacía para comentarios.

Todo el contenido XML, excepto los comentarios, se pasará a la salida.

Para formatear correctamente la salida, configure la salida @indent="yes":

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

Es posible que desee ver en la herramienta xmllint. Tiene varias opciones (uno de los cuales --format hará una impresión bastante), pero no puedo encontrar la manera de eliminar los comentarios usando esta herramienta.

Además, echa un vistazo a XMLStarlet , un montón de herramientas de línea de comando para hacer cualquier cosa que usted quiere con xml. A continuación, hacer:

xml c14n --without-comments # XML file canonicalization w/o comments

Editar : OP finalmente utiliza esta línea:

xmlstarlet c14n --without-comments old.xml > new.xml

Para poner en orden algo tan simple como server.xml de Tomcat, utilizo

sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"

es decir.

function tidy() {
 echo "$( cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")"
}

tidy server.xml

... imprimirá el código XML sin comentarios.

NOTA: mientras funciona razonablemente bien para cosas simples, se producirá un error con ciertos bloques CDATA y algunas otras situaciones. Sólo se debe usar para los scripts XML controlados que no tienen necesidad y nunca tendrá que escapar de una sola <-- o --> en cualquier lugar!

En primer lugar sed marcas comentario de arranque y parada con caracteres 0x0, entonces GrEP con golosinas -z 0x0 como el único delimitador de línea, las búsquedas de las líneas que comienzan con comentario, es -v invierte el filtro, dejando sólo las líneas significativas. Por último, tr -d \ 0` elimina todos estos 0x0, y pulirlo, otro grep elimina las líneas vacías:. Voilá

La mejor manera sería utilizar un analizador XML para manejar todos los casos de esquina oscuros correctamente. Pero si usted necesita algo rápido y sucio, hay una variedad de soluciones cortas usando expresiones regulares Perl que puede ser suficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top