代码之家  ›  专栏  ›  技术社区  ›  elcuco

从XML文件中去掉注释,并漂亮地打印出来

  •  14
  • elcuco  · 技术社区  · 15 年前

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

    从Linux命令行中去掉所有注释并很好地格式化XML的“最佳方法”是什么?

    5 回复  |  直到 8 年前
        1
  •  22
  •   alexgirao    12 年前

    你可以用整洁的

    $ 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>
    
        2
  •  11
  •   Mads Hansen    15 年前

    运行XML通过 identity transform XSLT,注释模板为空。

    除了注释之外,所有XML内容都将传递给输出。

    要想Niecley格式化输出,请设置输出@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>
    
        3
  •  7
  •   Daren Thomas    15 年前

    你可能想看看 xmllint 工具。它有几个选择(其中一个 --format 将做一个漂亮的打印),但我不知道如何删除使用这个工具的评论。

    此外,检查 XMLStarlet 一堆命令行工具,可以用XML做任何您想做的事情。然后这样做:

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

    编辑 :op最终使用此行:

    xmlstarlet c14n --without-comments old.xml > new.xml
    
        4
  •  1
  •   Alex Pakka    8 年前

    为了整理像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脚本的受控XML脚本使用它 <-- --> 任何地方!

    首先,sed用0x0字符标记注释的开始和停止,然后用grep -z 将0x0视为唯一的行分隔符,搜索以注释开头的行,它的-v反转过滤器,只留下有意义的行。最后, tr -d \ 0`删除所有这些0x0,为了进行润色,另一个grep删除空行:voila。

        5
  •  -1
  •   ire_and_curses    15 年前

    最好的方法是使用XML解析器来正确处理所有不明显的角情况。但是如果你需要一些快速和肮脏的东西,有很多 short solutions using Perl regexes 这可能就足够了。

    推荐文章