我有这个巨大的 xml 文件,其中包含很多评论。
什么是去除所有注释并从 linux 命令行很好地格式化 xml 的“最佳方法”?
你可以使用整洁
$ 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>
通过身份转换XSLT 运行您的 XML,并使用空模板进行注释。
除注释外,所有 XML 内容都将传递到输出。
为了侄女格式化输出,设置输出@indent="yes":
<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>
您可能想查看该xmllint
工具。它有几个选项(其中一个--format
会打印得很漂亮),但我不知道如何使用这个工具删除评论。
另外,请查看XMLStarlet,这是一组命令行工具,可以用 xml 做任何你想做的事情。然后做:
xml c14n --without-comments # XML file canonicalization w/o comments
编辑: OP 最终使用了这一行:
xmlstarlet c14n --without-comments old.xml > new.xml
为了整理像 Tomcat 的 server.xml 这样简单的东西,我使用
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
... 将打印没有注释的 xml。
注意:虽然它在简单的事情上工作得相当好,但它会在某些 CDATA 块和其他一些情况下失败。仅将它用于不需要也永远不需要转义单个<--
或-->
任何地方的受控 xml 脚本!
首先 sed 用 0x0 字符标记注释的开始和结束,然后 grep with-z
将 0x0 作为唯一的行分隔符,搜索以注释开头的行,它的 -v 反转过滤器,只留下有意义的行。最后,tr -d
\0` 删除了所有这些 0x0,为了完善它,另一个 grep 删除了空行:瞧。
最好的方法是使用 XML 解析器来正确处理所有晦涩的极端情况。但是,如果您需要一些快速而肮脏的东西,那么使用 Perl 正则表达式的各种简短解决方案可能就足够了。