Как частично красиво распечатать файлы 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/'