comando da CLI para atualizar o arquivo XML simples

1

Eu gostaria de atualizar programaticamente uma string em um arquivo de configuração XML muito simples, como este:

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

Existe um comando CLI simples que atualizará x / z e NOT y / z? Talvez com um argumento do seletor XPath, como:

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

Eu poderia escrever algo em Perl ou Python, mas dada a simplicidade desse problema, acho que deve haver um utilitário Unix inteligente que já faz isso.

Atualização : Eu achei isso, mas parece um pouco exagerado. E eu teria que aprender primeiro o XSLT. link

    
por Willem 20.02.2015 / 14:09

1 resposta

3

Você pode usar as ferramentas xml2 / 2xml para processar XML na linha de comando sem muita confusão. xml2 converte um documento XML em um formato orientado por linha, adequado para uso com ferramentas tradicionais de processamento de texto, como awk ou sed , e 2xml assume esse formato e o converte de volta para XML.

Para o seu exemplo, se eu pegar este documento:

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

executando xml2 nesse conteúdo:

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

Eu posso modificar o conteúdo do elemento <z> como este

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

Estou usando uma expressão de pesquisa sed para procurar explicitamente a linha começando com /doc/y/z e, em seguida, modificando o conteúdo dessa linha, o que nos dá:

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

Eu passei a saída por tidyp , um formatador XML, porque caso contrário, o documento ficaria assim:

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

... que está sintaticamente correto, mas mais difícil de ler.

    
por 20.02.2015 / 14:30