Команда CLI для обновления простого XML-файла

Я хотел бы программно обновить строку в очень простом файле конфигурации XML, таком как это:

<?xml version="1.0"?>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>

Простая команда CLI существует, который обновит x/z и НЕ y/z? Возможно, с аргументом селектора XPath, таким как:

$ xml-update myfile.xml /x/z "my new string"

Я мог записать что-то в Perl или Python, но, учитывая простоту этой проблемы, я предполагаю, что должна быть умная утилита Unix, которая уже делает это.

Обновление: Я нашел это, но это кажется небольшим излишеством. И я должен был бы изучить XSLT сначала. http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/

1
задан 20 February 2015 в 15:09
1 ответ

Вы можете использовать инструменты xml2 / 2xml для обработки XML в командной строке без особых хлопот. xml2 преобразует XML-документ в строчно-ориентированный формат, подходящий для использования с традиционными инструментами обработки текста, такими как awk или sed и 2xml принимает этот формат и преобразует его обратно в XML.

Для вашего примера, если я возьму этот документ:

<?xml version="1.0"?>
<doc>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>
</doc>

Выполнение xml2 для этого содержимого дает:

$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed

Я могу изменить содержимое подобный элемент

xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q

Я использую выражение поиска sed , чтобы явно искать строку начиная с / doc / y / z , а затем изменив содержимое этой строки, что дает нам:

<doc>
  <x>
    <z>look ma no hands</z>
  </x>
  <y>
    <z>should NOT be changed</z>
  </y>
</doc>

Я передал вывод через tidyp , средство форматирования XML, потому что в противном случае документ будет выглядеть так:

<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>

... что синтаксически правильно, но труднее читать.

3
ответ дан 3 December 2019 в 18:40

Теги

Похожие вопросы