¿Cómo eliminar comentarios de un archivo XML?

¿Cómo eliminar comentarios de un archivo XML?

¿Existe una herramienta de línea de comandos que pueda eliminar comentarios de un archivo XML? ¿O necesito escribir un pequeño programa que utilice un analizador XML para hacer esto?

Actualizar: No me interesan soluciones que solo manejen un subconjunto de todos los archivos XML posibles.

Por ejemplo, una expresión regular no puede manejar el análisis XML.

https://stackoverflow.com/questions/6751105/why-its-not-possible-to-use-regex-to-parse-html-xml-a-formal-explanation-in-la

Respuesta1

Yo lo haría de esta manera:

cat myfile.xml | sed '/<!--.*-->/d' | sed '/<!--/,/-->/d' > cleaned.xml

O:

awk 'in_comment&&/-->/{sub(/([^-]|-[^-])*--+>/,"");in_comment=0}
 in_comment{next}
 {gsub(/<!--+([^-]|-[^-])*--+>/,"");
  in_comment=sub(/<!--+.*/,"");
  print}'

O:

xmlstarlet ed -d '//comment()' file.xml

Respuesta2

Para ampliar la respuesta superior. Si sólo deseas eliminar el comentario y no toda la línea, probablemente deberías usar:

sed 's/<!--.*-->//'

En mi caso, tenía un archivo XML minimizado donde todo el contenido estaba en una sola línea y como la solución anterior eliminaba toda la línea donde se encontraba el comentario, borraría completamente mi archivo.

Respuesta3

Esto es bueno para limpiar comentarios de varias líneas (como pruebas fallidas) de un xml, al menos los que haya seleccionado manualmente y que sean útiles para el usuario final:
perl -i -w -0777pe 's/<!--(.(?<!(HELP|TODO)))*?-->//sg' somefile.xml

más sobre expresiones regulares relacionadas:https://stackoverflow.com/a/1240293/1422630

Si hay una manera de obtener el mismo resultado pero usando xmlstarlet, lo preferiría, ya que puede haber alguna excepción que las expresiones regulares no puedan manejar, pero por ahora esto es lo que tengo que usar.

información relacionada