如何从命令行部分漂亮地打印XML文件



我正在编写一个unix shell脚本,需要在其中漂亮地打印XML文件,但问题是,它们的某些部分我可能不会碰。也就是说,它们是ApacheJelly脚本,包含在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,如果重要的话。

当要求元素jell:script中没有空格可以更改时,您可以使用xml_pp(在安装了perl包perl-XML-Twig的linux上)。选项-p some-element可以用于保留这些元素中的所有空格:

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/'

相关内容

  • 没有找到相关文章

最新更新