Como remover comentários de um arquivo XML?

Como remover comentários de um arquivo XML?

Existe uma ferramenta de linha de comando que pode remover comentários de um arquivo XML? Ou preciso escrever um pequeno programa que utilize um analisador XML para fazer isso?

Atualizar: não estou interessado em soluções que lidem apenas com um subconjunto de todos os arquivos XML possíveis.

Por exemplo, um regexp não pode lidar com a análise de XML.

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

Responder1

Eu faria desta forma:

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

Ou:

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

Ou:

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

Responder2

Para expandir a resposta principal. Se você deseja excluir apenas o comentário e não a linha inteira, você provavelmente deveria usar:

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

No meu caso, eu tinha um arquivo XML reduzido onde todo o conteúdo estava em uma única linha e como a solução anterior excluiria toda a linha onde o comentário estava localizado, limparia completamente meu arquivo.

Responder3

Isso é bom para limpar comentários de múltiplas linhas (como testes com falha) de um xml, pelo menos aqueles que você escolheu a dedo e são úteis para o usuário final:
perl -i -w -0777pe 's/<!--(.(?<!(HELP|TODO)))*?-->//sg' somefile.xml

mais sobre regex relacionado:https://stackoverflow.com/a/1240293/1422630

Se houver uma maneira de obter o mesmo resultado, mas usando xmlstarlet, eu preferiria, pois pode haver alguma exceção que o regex pode não tratar, mas por enquanto é isso que tenho que usar.

informação relacionada