GNU/Linux >> Tutoriales Linux >  >> Linux

Use XMLStarlet para analizar XML en la terminal de Linux

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.


Linux
  1. Copiar archivos en la terminal de Linux

  2. Cambiar el nombre de un archivo en la terminal de Linux

  3. Mover archivos en la terminal de Linux

  4. Use la terminal de Linux para navegar por su computadora

  5. Use la terminal de Linux para ver qué archivos hay en su computadora

Relájate junto al fuego en tu terminal Linux

Cómo usar el comando de historial de Linux

Cómo usar el comando xargs de Linux

Cómo usar la terminal de Linux en Android

Cómo analizar o ver el código XML en la línea de comandos de Linux

Uso del comando grep en Linux