我有这个巨大的xml文件,其中包含很多注释。
什么是“最好的方法”去除所有注释并从linux命令行很好地格式化xml?
答案 0 :(得分:23)
你可以使用整洁的
$ 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>
答案 1 :(得分:11)
通过identity transform 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>
答案 2 :(得分:7)
您可能需要查看xmllint
工具。它有几个选项(其中一个--format
将做一个漂亮的打印),但我无法弄清楚如何使用此工具删除注释。
另外,请查看XMLStarlet,这是一组命令行工具,可以使用xml执行任何操作。然后做:
xml c14n --without-comments # XML file canonicalization w/o comments
编辑:OP最终使用了这一行:
xmlstarlet c14n --without-comments old.xml > new.xml
答案 3 :(得分:2)
为了整理像Tomcat的server.xml这样简单的东西,我使用了
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"
即。
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与-z
将0x0视为唯一的行分隔符,搜索以注释开头的行,它是-v反转过滤器,只留下有意义的行。最后,tr -d
\ 0`删除所有这些0x0,并进行优化,另一个grep删除空行:瞧。
答案 4 :(得分:-1)
最好的方法是使用XML解析器正确处理所有模糊的角落案例。但是如果你需要一些快速而又肮脏的东西,那么short solutions using Perl regexes就足够多了。{/ p>