题
我有一个包含很多评论这个巨大的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>
其他提示
运行通过身份的XML转换 XSLT,以征求意见的空模板。
所有XML内容的,除了评论,将通过到输出通过。
在为了niecely格式化输出,设定输出@缩进= “是”:
<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*$"
即。
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字符停止,然后用-z
对待为0x0的grep作为唯一的行定界符,用于启动与注释行搜索,这是-v反转过滤器,只留下有意义线。最后,tr -d
\ 0`删除所有这些0x0,以及抛光它,另一个grep,删除空行:。瞧
最好的办法是使用XML解析器来正确地处理所有不起眼的角落的情况。但是,如果你需要的东西快速和肮脏的,有各种各样的使用Perl的正则表达式短期的解决方案其可以是足够的。
不隶属于 StackOverflow