2015-11-05 5 views
0

Я пишу сценарий оболочки unix, где мне нужно довольно печатать 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 элемента новой строки перед ним.

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

+0

«, но подвох в том, что есть участки их, которых я не могу тронуть ». - Я думаю, что это дисквалифицирует «xmlstarlet», «xmllint» и, возможно, большинство инструментов на основе парсера XML. В противном случае я бы предложил [xmlstarlet ed] (http://stackoverflow.com/a/33292292/319698). – npostavs

ответ

1

Когда требование заключается в том в элемент желе: сценарий без пробелов может измениться, то вы можете использовать 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/' 

 Смежные вопросы

  • Нет связанных вопросов^_^