Aprender a analizar XML a menudo se considera una empresa compleja, pero no tiene por qué serlo. XML está altamente y estrictamente estructurado, por lo que es relativamente predecible. También existen muchas herramientas para ayudar a que el trabajo sea manejable.
Una de mis utilidades XML favoritas es XMLStarlet, un conjunto de herramientas XML para su terminal. Con XMLStarlet, puede validar, analizar, editar, formatear y transformar datos XML. XMLStarlet es un comando relativamente mínimo, pero la navegación XML tiene mucho potencial, por lo que este artículo demuestra cómo usarlo para consultar datos XML.
Instalar
XMLStarlet está instalado de forma predeterminada en CentOS, Fedora y muchas otras distribuciones modernas de Linux, así que simplemente abra una terminal y escriba xmlstarlet
para acceder a ella. Si XMLStarlet aún no está instalado, su sistema operativo ofrece instalarlo por usted.
Alternativamente, puede instalar el xmlstarlet
comando de su administrador de paquetes:
$ sudo dnf install xmlstarlet
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
En macOS, use MacPorts o Homebrew. En Windows, usa Chocolatey.
Si todo lo demás falla, puede instalarlo manualmente desde el código fuente en Sourceforge.
Análisis de XML con XMLStarlet
Hay muchas herramientas diseñadas para ayudar a analizar y transformar datos XML, incluidas bibliotecas de software que le permiten escribir su propio analizador y comandos complejos como fop
y xsltproc
. Sin embargo, a veces no es necesario procesar datos XML; solo necesita una forma conveniente de extraer datos importantes, actualizarlos o simplemente validarlos. Para interacciones XML espontáneas, uso xmlstarlet
, una clásica aplicación estilo "navaja suiza" que realiza las tareas XML más comunes. Puede ver lo que tiene para ofrecer ejecutando el comando junto con --help
opción:
$ xmlstarlet --help
Usage: xmlstarlet [<options>] <command> [<cmd-options>]
where <command> is one of:
ed (or edit) - Edit/Update XML document(s)
sel (or select) - Select data or query XML document(s) (XPATH, etc)
tr (or transform) - Transform XML document(s) using XSLT
val (or validate) - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG)
fo (or format) - Format XML document(s)
el (or elements) - Display element structure of XML document
c14n (or canonic) - XML canonicalization
ls (or list) - List directory as XML
[...]
Puede obtener más ayuda agregando --help
al final de cualquiera de estos subcomandos:
$ xmlstarlet sel --help
-Q or --quiet - do not write anything to standard output.
-C or --comp - display generated XSLT
-R or --root - print root element <xsl-select>
-T or --text - output is text (default is XML)
-I or --indent - indent output
[...]
Seleccionando datos con sel
Puede ver los datos en XML con xmlstarlet select
(sel
para abreviar) mando. Aquí hay un documento XML simple:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
<os>
<linux>
<distribution>
<name>Fedora</name>
<release>7</release>
<codename>Moonshine</codename>
<spins>
<name>Live</name>
<name>Fedora</name>
<name>Everything</name>
</spins>
</distribution>
<distribution>
<name>Fedora Core</name>
<release>6</release>
<codename>Zod</codename>
<spins></spins>
</distribution>
</linux>
</os>
</xml>
Al buscar datos en un archivo XML, su primera tarea es concentrarse en el nodo que desea explorar. Si conoce la ruta al nodo, especifique la ruta completa con --value-of
opción. Cuanto antes comience a explorar el árbol del Modelo de objetos del documento (DOM), más información verá:
$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution \
--nl myfile.xml
Fedora
7
Moonshine
Live
Fedora
Everything
Fedora Core
6
Zod
El --nl
significa "nueva línea" e inserta una gran cantidad de espacios en blanco para garantizar que el indicador de su terminal obtenga una nueva línea después de que se obtengan los resultados. He eliminado parte del exceso de espacio en la salida de muestra.
Estrecha tu enfoque descendiendo más en el árbol DOM:
$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution/name \
--nl myfile.xml
Fedora
Fedora Core
Selecciones condicionales
Una de las herramientas más poderosas para navegar y analizar XML se llama XPath. Gobierna la sintaxis utilizada en las búsquedas XML e invoca funciones de bibliotecas XML. XMLStarlet entiende las expresiones XPath, por lo que puede condicionar su selección con una función XPath. XPath presenta una gran cantidad de funciones y está documentado en detalle por W3C, pero encuentro que la documentación de XPath de Mozilla es más concisa.
Puede usar corchetes como una función de prueba, comparando el contenido de un elemento con algún valor. Aquí hay una prueba para el valor de <name>
elemento, que devuelve el número de versión asociado solo con una coincidencia específica.
Imagine por un momento que el archivo XML de muestra contiene todas las versiones de Fedora que comienzan con 1. Para ver todos los números de versión asociados con el antiguo nombre "Fedora Core" (el proyecto eliminó "Core" del nombre desde la versión 7 en adelante):
$ xmlstarlet sel --template \
--value-of '/xml/os/linux/distribution[name = "Fedora Core"]/release' \
--nl myfile.xml
6
5
4
3
2
1
También puede ver todos los nombres en clave de esos lanzamientos cambiando el --value-of
ruta a /xml/os/linux/distribution[name = "Fedora Core"]/codename
.
Coincidencia de rutas y obtención de valores
Una ventaja de ver las etiquetas XML como nodos es que una vez que encuentra el nodo, puede considerarlo como su "directorio" de datos actual. No es realmente un directorio, al menos no en el sentido del sistema de archivos, pero es una colección de datos que puede consultar. Para ayudarlo a mantener su destino y los datos "dentro" separados, XMLStarlet diferencia entre lo que está tratando de hacer coincidir con --match
opción y el valor de los datos que desea con un --value-of
opción.
Suponga que sabe que el <spin>
El nodo contiene varios elementos. Eso lo convierte en tu destino. Una vez que esté allí, puede usar --value-of
para especificar para qué elemento desea un valor. Para mirar todos los elementos, use un punto (.
) para representar su ubicación actual:
$ xmlstarlet sel --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' --nl myfile.xml \
Live
Fedora
Everything
Al igual que con la navegación por el DOM, puede usar expresiones XPath para limitar el alcance de los datos que se devuelven. En este ejemplo, uso el last()
función para recuperar solo el último elemento en el spin
nodo:
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[last()]' --nl myfile.xml
Everything
En este ejemplo, uso la position()
función para seleccionar un elemento específico en el spin
nodo:
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[position() = 2]' --nl myfile.xml
Fedora
El --match
y --value-of
las opciones pueden superponerse, por lo que depende de usted cómo desea usarlas juntas. Estas dos expresiones, en el caso del XML de muestra, hacen lo mismo:
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' \
--nl myfile.xml
Live
Fedora
Everything
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution' \
--value-of 'spin' \
--nl myfile.xml
Live
Fedora
Everything
Sentirse cómodo con XML
XML puede parecer demasiado detallado y difícil de manejar a veces, pero las herramientas creadas para interactuar con él me sorprenden constantemente. Si busca aprovechar XML, entonces XMLStarlet podría ser un buen punto de entrada. La próxima vez que esté a punto de abrir un archivo XML para ver datos estructurados, intente usar XMLStarlet y vea si puede consultar esos datos en su lugar. Cuanto más se sienta cómodo con XML, mejor podrá servirle como un formato de datos sólido y flexible.