16

我有这个巨大的 xml 文件,其中包含很多评论。

什么是去除所有注释并从 linux 命令行很好地格式化 xml 的“最佳方法”?

4

5 回答 5

25

你可以使用整洁

$ 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>
于 2013-04-02T22:46:53.603 回答
11

通过身份转换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>
于 2009-09-23T11:14:33.193 回答
7

您可能想查看该xmllint工具。它有几个选项(其中一个--format会打印得很漂亮),但我不知道如何使用这个工具删除评论。

另外,请查看XMLStarlet,这是一组命令行工具,可以用 xml 做任何你想做的事情。然后做:

xml c14n --without-comments # XML file canonicalization w/o comments

编辑: OP 最终使用了这一行:

xmlstarlet c14n --without-comments old.xml > new.xml
于 2009-09-23T08:29:12.940 回答
3

为了整理像 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 删除了空行:瞧。

于 2017-04-01T08:56:33.960 回答
-1

最好的方法是使用 XML 解析器来正确处理所有晦涩的极端情况。但是,如果您需要一些快速而肮脏的东西,那么使用 Perl 正则表达式的各种简短解决方案可能就足够了。

于 2009-09-23T09:47:48.500 回答