elimine los comentarios del archivo xml e imprímalo
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?
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.