Aprende a usar xmlstarlet para actualizar valores en archivos XML y manejar cargas XML complejas de manera eficiente en tus scripts de shell

Si trabajas en TI o incluso si consideras TI como uno de tus principales pasatiempos, has escrito un script de shell en algún momento. Si también trabajas en el lado operativo del negocio, esta puede ser tu tarea diaria. Crear, mantener o actualizar el proceso existente.
Hoy en día, es más común interactuar con sistemas externos que utilizan cargas en archivos XML o incluso archivos de configuración escritos en este formato.
El script de shell nativo no proporciona una manera fácil de hacer eso ni bibliotecas de soporte para manejarlo como podemos en lenguajes de programación modernos como Python, Java o Go. Así que, probablemente te has encontrado escribiendo código para analizar este tipo de carga. Pero esta no es la única manera de hacerlo, y podemos (¡y debemos!) aprovechar las utilidades existentes para hacer este trabajo por nosotros.
xmlstarlet
No pude encontrar una mejor manera de explicar lo que hace xmlstarlet que la definición que los propietarios hacen en su repositorio de código fuente:
XMLStarlet es un conjunto de herramientas XML de línea de comandos que se puede usar para transformar,
consultar, validar y editar documentos y archivos XML usando un conjunto simple de comandos de shell
de manera similar a como se hace para archivos de texto plano usando grep/sed/awk/
tr/diff/patch.
Así que, xmlstarlet proporciona todo el poder para hacer cualquier cosa que puedas imaginar al tratar con XML de manera similar a como si fueran archivos de texto plano.
Instalación
El proceso de instalación de esta utilidad es bastante fácil y depende del sistema operativo que estés usando. Asumiré que la mayoría de los scripts de shell están dirigidos a una máquina Unix. Instalar esto es bastante fácil ya que la mayoría de los repositorios de paquetes tienen una versión de esta herramienta.
Así que, si estás usando un sistema basado en apt, necesitas ejecutar el comando:
sudo apt-get install xmlstarlet
Si estás usando otra plataforma, no te preocupes porque tienen versiones disponibles para todos los sistemas operativos y plataformas más utilizados, como puedes ver en el enlace a continuación:
Uso
Tan pronto como tengamos este software instalado, lo primero que haremos es lanzarlo para ver las opciones disponibles.
XMLStarlet Toolkit: Utilidades de línea de comandos para XML Uso: D:DataDownloadsxmlstarlet-1.6.1-win32xmlstarlet-1.6.1xmlstarlet.exe [<opciones>] <comando> [<opciones-cmd>] donde <comando> es uno de: ed (o edit) - Editar/Actualizar documento(s) XML sel (o select) - Seleccionar datos o consultar documento(s) XML (XPATH, etc) tr (o transform) - Transformar documento(s) XML usando XSLT val (o validate) - Validar documento(s) XML (bien formado/DTD/XSD/RelaxNG) fo (o format) - Formatear documento(s) XML el (o elements) - Mostrar estructura de elementos del documento XML c14n (o canonic) - Canonicalización XML ls (o list) - Listar directorio como XML esc (o escape) - Escapar caracteres especiales XML unesc (o unescape) - Desescapar caracteres especiales XML pyx (o xmln) - Convertir XML en formato PYX (basado en ESIS - ISO 8879) p2x (o depyx) - Convertir PYX en XML <opciones> son: -q o --quiet - sin salida de error --doc-namespace - extraer enlaces de espacio de nombres del documento de entrada (por defecto) --no-doc-namespace - no extraer enlaces de espacio de nombres del documento de entrada --version - mostrar versión --help - mostrar ayuda Dondequiera que se mencione el nombre del archivo en la ayuda del comando, se asume que se puede usar una URL en su lugar también. Escribe: xmlstarlet <comando> --help <ENTER> para ayuda del comando
Así que lo primero que necesitamos decidir es qué comando necesitamos usar, y estos comandos están relacionados uno a uno con la acción que queremos realizar. Me centraré en los comandos principales en este post, pero como puedes ver, esto cubre desde seleccionar valores en un XML, actualizarlo o incluso validarlo.
Caso de uso 1: Seleccionar un valor.
Vamos a comenzar con el caso de uso más simple, intentar seleccionar un valor de un XML (file.xml) como este:
<root> <object1 name="attribute_name">valor en XML</object1>
</root>
Así que, vamos a comenzar con el comando más simple:
./xmlstarlet sel -t -v "/root/object1" ./file.xml
valor en XML
Esto proporciona el valor dentro del elemento object1, usando -t para definir una nueva plantilla y -v para especificar la sentencia value-of. Si ahora, quisiéramos obtener el valor del atributo, podemos hacerlo de manera muy similar al comando anterior:
./xmlstarlet sel -t -v "/root/object1/@name" ./file.xml
attribute_name
Caso de uso 2: Actualizar valor.
Ahora, seguiremos el otro enfoque basado en el mismo archivo. Actualizaremos el valor del elemento object1 para establecer el texto «texto actualizado».
Para hacer eso, ejecutamos el siguiente comando:
./xmlstarlet ed -u "/root/object1" -v "texto actualizado" ./file.xml
<?xml version="1.0"?> <root> <object1 name="attribute_name">texto actualizado</object1> </root>
Resumen
xmlstarlet nos proporcionará todas las opciones para manejar algo tan complicado como lo es XML y realizar todas las tareas que puedas imaginar de manera simple sin necesidad de codificar tú mismo toda la lógica de análisis. Espero que seas un desarrollador más feliz desde ahora cuando necesites manejar un XML dentro de un script de shell.




