
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 NÃO y/z ? Talvez com um argumento seletor XPath, como:
$ xml-update myfile.xml /x/z "my new string"
Eu poderia escrever algo em Perl ou Python, mas dada a simplicidade deste problema, acho que deve haver um utilitário Unix inteligente que já faça isso.
Atualizar: Eu encontrei isso, mas parece um pouco exagerado. E eu teria que aprender XSLT primeiro.http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/
Responder1
Você pode usar oxml2/2xmlferramentas para processar XML na linha de comando sem muito barulho. xml2
converte um documento XML em um formato orientado a linhas adequado para uso com ferramentas tradicionais de processamento de texto como awk
ou sed
, e 2xml
pega esse formato e o converte de volta para XML.
Para 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>
Executar xml2
esse conteúdo produz:
$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed
Posso modificar o conteúdo do <z>
elemento assim
xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q
Estou usando uma sed
expressão de pesquisa para procurar explicitamente a linha que começa com /doc/y/z
e, em seguida, modificar 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>
Passei a saída por tidyp
um formatador XML, pois 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 é sintaticamente correto, mas mais difícil de ler.