2009-09-23 12 views
12

Tengo este enorme archivo xml que contiene muchos comentarios.quita los comentarios del archivo xml e imprime bastante

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

+0

Posible duplicado de [Eliminar comentarios XML usando Regex en bash] (http://stackoverflow.com/questions/19230407/remove-xml-comments-using-regex-in-bash) – malat

Respuesta

17

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

Agregue "-modify" a los parámetros para cambiar el archivo en su lugar. (Hiciste una copia de seguridad, ¿verdad?) –

7

Es posible que desee mirar la herramienta xmllint. Tiene varias opciones (una de las cuales --format hará una impresión bonita), pero no puedo encontrar la manera de eliminar los comentarios con esta herramienta.

Además, consulte XMLStarlet, un conjunto de herramientas de línea de comandos para hacer cualquier cosa que desee con xml. Luego hacen:

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

EDITAR: OP finalmente utilizan esta línea:

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

xmllint es una interfaz de línea de comando para libxml2 , una biblioteca con enlaces para muchos idiomas. P.ej. Yo uso XML :: LibXML en Perl. – reinierpost

+0

Yo siempre lo usé: xmlstarlet c14n --sin comentarios. Old.xml> new.xml – elcuco

-2

La mejor manera sería utilizar un analizador XML para manejar todos los casos de esquina oscuros correctamente. Pero si necesita algo rápido y sucio, hay una variedad de short solutions using Perl regexes que puede ser suficiente.

+3

No use expresiones regulares en XML. – reinierpost

+0

@reinierpost: Entiendo por qué esta respuesta parece desagradable.Pero si esto es algo único, y usted sabe que sus comentarios son un subconjunto bien restringido de la especificación de comentarios, ¿qué ocurre con una solución de expresiones regulares? Acepto que es preferible una herramienta de análisis sintáctico (y es la mejor respuesta), pero creo que esta es una alternativa válida en algunas situaciones específicas (por ejemplo, pruebas simples o llamadas a crisis de 2AM en un sistema de solo lectura), y puede ser bastante conveniente . –

+0

Con un XML válido y, por lo tanto, solo comentarios que son comentarios, creo que un analizador XML es mejor. Sin embargo, si maneja HTML con comentarios que incluyen condiciones (es decir, piensa en Internet Explorer), entonces una expresión regular es probablemente la mejor opción. –

10

Ejecute su XML a través de un identity transform XSLT, con una plantilla vacía para comentarios.

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

Con el fin de dar formato a la salida niecely, ajuste la salida @ guión = "sí":

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

para poner en orden algo tan simple como server.xml de Tomcat , Yo uso

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

Ie

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: aunque funciona razonablemente bien para cosas simples, fallará con ciertos bloques CDATA y algunas otras situaciones. ¡Úselo solo para scripts xml controlados que no necesitan y nunca tendrán que escapar de un solo <-- o --> en cualquier lugar!

Primero sed marca el inicio y finalización del comentario con 0x0 caracteres, luego grep con -z trata 0x0 como el único delimitador de línea, busca líneas comenzando con comentario, es -v invierte el filtro, dejando solo líneas significativas. Finalmente, tr -d \ 0` borra todos estos 0x0, y para pulirlo, otro grep elimina las líneas vacías: voila.

Cuestiones relacionadas