Как удалить комментарии из XML-файла?

Как удалить комментарии из XML-файла?

Есть ли инструмент командной строки, который может удалить комментарии из XML-файла? Или мне нужно написать небольшую программу, которая использует XML-парсер для этого?

Обновлять: Меня не интересуют решения, которые обрабатывают только подмножество всех возможных XML-файлов.

Например, регулярное выражение не может обрабатывать XML-анализ.

https://stackoverflow.com/questions/6751105/почему-его-не-возможно-использовать-регулярное-выражение-для-анализа-html-xml-формального-объяснения-в-la

решение1

Я бы сделал это так:

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

Или:

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

Или:

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

решение2

Чтобы расширить верхний ответ. Если вы хотите удалить только комментарий, а не всю строку, вам, вероятно, следует использовать:

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

В моем случае у меня был минифицированный XML-файл, все содержимое которого находилось в одной строке, и поскольку предыдущее решение удалило бы всю строку, в которой находился комментарий, это полностью очистило бы мой файл.

решение3

Это полезно для удаления многострочных комментариев (например, проваленных тестов) из XML-файла, по крайней мере тех, которые вы выбрали вручную и которые полезны конечному пользователю:
perl -i -w -0777pe 's/<!--(.(?<!(HELP|TODO)))*?-->//sg' somefile.xml

больше о связанных регулярных выражениях:https://stackoverflow.com/a/1240293/1422630

Если есть способ получить тот же результат, но с помощью xmlstarlet, я бы предпочел это, поскольку могут быть какие-то исключения, которые regex может не обработать, но на данный момент мне придется использовать именно это.

Связанный контент