
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. xml2
convierte un documento XML a un formato orientado a líneas adecuado para su uso con herramientas de procesamiento de texto tradicionales como awk
o sed
, 2xml
toma 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 xml2
ese 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 sed
expresión de búsqueda para buscar explícitamente la línea que comienza con /doc/y/z
y 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.