从xml文件中删除注释并将其打印出来

时间:2009-09-23 08:27:17

标签: xml bash sh

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

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

5 个答案:

答案 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>