Comando CLI para actualizar un archivo XML simple

Comando CLI para actualizar un archivo XML simple

Me gustaría actualizar mediante programación una cadena en un archivo de configuración XML muy simple, como este:

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

¿Existe un comando CLI simple que actualice x/z y NO y/z? Quizás con un argumento de selector XPath, como por ejemplo:

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

Podría escribir algo en Perl o Python, pero dada la simplicidad de este problema, supongo que debe haber una utilidad Unix inteligente que ya lo haga.

Actualizar: Encontré esto pero parece un poco excesivo. Y primero tendría que aprender XSLT.http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/

Respuesta1

Puedes usar elxml2/2xmlherramientas para procesar XML en la línea de comando sin demasiado problema. xml2convierte un documento XML a un formato orientado a líneas adecuado para su uso con herramientas de procesamiento de texto tradicionales como awko sed, 2xmltoma este formato y lo convierte nuevamente a XML.

Para su ejemplo, si tomo este documento:

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

Ejecutar xml2ese contenido produce:

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

Puedo modificar el contenido del <z>elemento de esta manera.

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

Estoy usando una sedexpresión de búsqueda para buscar explícitamente la línea que comienza con /doc/y/zy luego modificando el contenido de esa línea, lo que nos da:

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

Pasé el resultado a través de tidyp, un formateador XML, porque de lo contrario el documento se vería así:

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

...que es sintácticamente correcto pero más difícil de leer.

información relacionada