Как частично красиво распечатать файлы XML из командной строки?

Я пишу сценарий оболочки Unix, где мне нужно красиво печатать XML-файлы, но суть в том, что есть некоторые их части, которые я могу не трогать. А именно, это скрипты Apache Jelly, которые содержатся в 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 Элемент является новой строкой перед ним.

Я не мог найти какой-либо вариант в xmllint или же xmlstarlet игнорировать определенный элемент. Есть ли инструмент, который может помочь мне достичь этого? Я на Linux, если это имеет значение.

1 ответ

Решение

Если требуется, чтобы внутри элемента jelly: script не было пробелов, вы можете использовать xml_pp (на linux, установленном с пакетом perl perl-XML-Twig, Опция -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/'
Другие вопросы по тегам