【发布时间】:2010-11-30 16:26:03
【问题描述】:
我有一个包含很多 cmets 的巨大 xml 文件。
去除所有 cmets 并从 linux 命令行很好地格式化 xml 的“最佳方法”是什么?
【问题讨论】:
我有一个包含很多 cmets 的巨大 xml 文件。
去除所有 cmets 并从 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>
【讨论】:
通过identity transform XSLT 运行您的XML,并为cmets 提供一个空模板。
除了 cmets 之外的所有 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>
【讨论】:
<xsl:template match="@*| * | text() | processing-instruction() | comment()[contains(., 'licence')]">一起使用
您可能想查看xmllint 工具。它有几个选项(其中一个--format 会打印得很漂亮),但我不知道如何使用这个工具删除 cmets。
另外,请查看XMLStarlet,这是一组命令行工具,可以用 xml 完成任何您想做的事情。然后做:
xml c14n --without-comments # XML file canonicalization w/o comments
EDIT: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
... 将打印没有 cmets 的 xml。
注意:虽然它在简单的事情上工作得相当好,但在某些 CDATA 块和其他一些情况下它会失败。仅将它用于不需要也永远不需要在任何地方转义单个 <-- 或 --> 的受控 xml 脚本!
首先 sed 用 0x0 字符标记注释的开始和结束,然后 grep 和 -z 将 0x0 视为唯一的行分隔符,搜索以注释开头的行,它的 -v 反转过滤器,只留下有意义的行。最后,tr -d\0` 删除了所有这些 0x0,为了完善它,另一个 grep 删除了空行:瞧。
【讨论】:
最好的方法是使用 XML 解析器来正确处理所有晦涩的极端情况。但是,如果您需要快速而肮脏的东西,有多种short solutions using Perl regexes 可能就足够了。
【讨论】: