如何从 XML 文件中删除注释?

如何从 XML 文件中删除注释?

是否有命令行工具可以从 XML 文件中删除注释?或者我需要编写一个使用 XML 解析器的小程序来执行此操作吗?

更新:我对仅处理所有可能的 XML 文件的子集的解决方案不感兴趣。

例如,正则表达式不能处理 XML 解析。

https://stackoverflow.com/questions/6751105/why-its-not-possible-to-use-regex-to-parse-html-xml-a-formal-explanation-in-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 来获得相同的结果,我会更愿意使用,因为可能存在一些正则表达式无法处理的异常,但目前这是我必须使用的。

相关内容