我有一个包含很多评论这个巨大的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的正则表达式短期的解决方案其可以是足够的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top