[英]strip comments from xml file and pretty-print it
我有這個巨大的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>
通過身份轉換 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>
您可能希望查看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字符標記注釋的開始和停止,然后grep用-z
將0x0視為唯一的行分隔符,搜索以注釋開頭的行,它的-v反轉過濾器,只留下有意義的行。 最后, tr -d
\\ 0`刪除所有這些0x0,並將其拋光,另一個grep刪除空行:瞧。
最好的方法是使用XML解析器正確處理所有模糊的邊角情況。 但是如果你需要快速和骯臟的東西, 使用Perl正則表達式的各種簡短解決方案可能就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.