簡體   English   中英

從xml文件中刪除注釋並將其打印出來

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM