Удалите блок строк из файла xml с помощью xmllint

У меня есть файл Test.xml со следующим содержанием.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright XXXXXX -->
<services>
    <service>
        <ServiceName>service1</ServiceName>
        <ServiceId>100</ServiceId>
    </service>
    <service>
        <ServiceName>service2</ServiceName>
        <ServiceId>200</ServiceId>
    </service>
    <service>
        <ServiceName>service3</ServiceName>
        <ServiceId>300</ServiceId>
    </service>
</services>

Исходя из названия службы, мне нужно удалить весь блок этой службы.

Предположим, что service1 - это имя, которое я получил в качестве входных данных, тогда следующий блок должен быть удален из xml.

<service>
    <ServiceName>service1</ServiceName>
    <ServiceId>100</ServiceId>
</service>

Я могу сделать это с помощью awk/sed/grep. Но я должен использовать xmllint или другую утилиту для синтаксического анализа xml.

После исследования я мог закрыть выход, используя команду ниже. Но в выводе отсутствуют версия xml и родительские теги (службы).

xmllint --xpath "//services/service[ServiceName!='service1']" Test.xml

person Tejaswi Burgula    schedule 28.12.2017    source источник
comment
Можете ли вы использовать XSLT вместо XPath? Если да, проверьте команду xsltproc + преобразование XSL   -  person Bela Vizer    schedule 28.12.2017
comment
@Bela Vizer, да я могу использовать xsltproc. Я попробую это однажды.   -  person Tejaswi Burgula    schedule 29.12.2017


Ответы (1)


xmlstarlet решение:

xmlstarlet ed -d "//service[ServiceName='service1']" test.xml

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright XXXXXX -->
<services>
  <service>
    <ServiceName>service2</ServiceName>
    <ServiceId>200</ServiceId>
  </service>
  <service>
    <ServiceName>service3</ServiceName>
    <ServiceId>300</ServiceId>
  </service>
</services>

  • //service[ServiceName='service1'] - выражение xpath, выбирает узел service, у которого есть дочерний узел ServiceName со значением service1

Чтобы изменить файл "на месте" - добавьте -L параметр: xmlstarlet ed -L ...

person RomanPerekhrest    schedule 28.12.2017
comment
Роман, спасибо за ответ. Но, извините, я не могу использовать xmlstarlet. - person Tejaswi Burgula; 29.12.2017
comment
@TejaswiBurgula, значит, вы написали запутанное описание: xmllint или какая-то другая утилита для синтаксического анализа xml - person RomanPerekhrest; 29.12.2017
comment
Значит, xmllint или какая-нибудь другая утилита, например xsltproc. Я использовал xsltproc, он работает нормально. Спасибо. - person Tejaswi Burgula; 12.01.2018