2015-11-05 61 views
0

我正在寫一個unix shell腳本,我需要漂亮地打印XML文件, ,但問題在於,有些部分可能無法觸及。 也就是說,它們是Apache Jelly腳本,它們包含在我需要打印的XML 文件中。所以,我需要這個如何從命令行部分漂亮地打印XML文件?

<proc source="customer"><scriptParam value="_user"/><scriptText><jelly:script> 

    <jelly:log level="info"> 
    this text needs 
     to keep its indent level 
     and this is none of my business 
    </jelly:log> 

    <!-- get date --> 
    <sql:query var="rs"><![CDATA[ 
    select sysdate 
    from dual 
    ]]></sql:query> 

</jelly:script> 
</scriptText></proc> 

轉換成該

<proc source="customer"> 
    <scriptParam value="_user"/> 
    <scriptText> 
<jelly:script> 

    <jelly:log level="info"> 
    this text needs 
     to keep its indent level 
     and this is none of my business 
    </jelly:log> 

    <!-- get date --> 
    <sql:query var="rs"><![CDATA[ 
    select sysdate 
    from dual 
    ]]></sql:query> 

</jelly:script> 
    </scriptText> 
</proc> 

注意的jelly:script元素唯一的變化是換行 之前。

我找不到xmllintxmlstarlet中的任何選項忽略某個元素的 。有什麼工具可以幫助我實現這個目標嗎?如果有問題,我在 Linux上。

+0

「,但美中不足的是,也有部分他們,我可能不會碰。「 - 我認爲這會使xmlstarlet,xmllint以及大多數基於XML解析器的工具失效。否則,我會[建議'xmlstarlet ed'](http://stackoverflow.com/a/33292292/319698)。 – npostavs

回答

1

當要求是元素果凍:腳本沒有空格可能會改變,那麼你可以使用xml_pp(與perl的包perl-XML-Twig-p some-element可以用來保護這些元素中的所有空格選項安裝了Linux:

xml_pp -p jelly:script thefile.xml 

,將創造這樣的:

<proc source="customer"> 
    <scriptParam value="_user"/> 
    <scriptText> 
    <jelly:script> 

    <jelly:log level="info"> 
    this text needs 
     to keep its indent level 
     and this is none of my business 
    </jelly:log> 

    <!-- get date --> 
    <sql:query var="rs"><![CDATA[ 
    select sysdate 
    from dual 
    ]]></sql:query> 

</jelly:script> 
    </scriptText> 
</proc> 

正如你可以看到開始元素<jelly:script>也縮進,因爲添加的空間仍然在元素之外。

如果是禁止的,那麼你必須選擇一個水平(scriptText),也可能是管到再次刪除這些空格的命令:

xml_pp -p jelly:script thefile.xml | perl -pe 's/^\s*(<jelly:script>)/$1/'