GNU/Linux >> Tutoriels Linux >  >> Linux

Utiliser XMLStarlet pour analyser XML dans le terminal Linux

Apprendre à analyser XML est souvent considéré comme une entreprise complexe, mais ce n'est pas obligatoire. XML est hautement et strictement structuré, il est donc relativement prévisible. Il existe également de nombreux outils pour rendre le travail gérable.

L'un de mes utilitaires XML préférés est XMLStarlet, une boîte à outils XML pour votre terminal. Avec XMLStarlet, vous pouvez valider, analyser, éditer, formater et transformer des données XML. XMLStarlet est une commande relativement minimale, mais la navigation XML est pleine de potentiel, donc cet article montre comment l'utiliser pour interroger des données XML.

Installer

XMLStarlet est installé par défaut sur CentOS, Fedora et de nombreuses autres distributions Linux modernes, il suffit donc d'ouvrir un terminal et de taper xmlstarlet pour y accéder. Si XMLStarlet n'est pas déjà installé, votre système d'exploitation propose de l'installer pour vous.

Alternativement, vous pouvez installer le xmlstarlet commande de votre gestionnaire de paquets :

$ sudo dnf install xmlstarlet

Plus de ressources Linux

  • Aide-mémoire des commandes Linux
  • Aide-mémoire des commandes Linux avancées
  • Cours en ligne gratuit :Présentation technique de RHEL
  • Aide-mémoire sur le réseau Linux
  • Aide-mémoire SELinux
  • Aide-mémoire sur les commandes courantes de Linux
  • Que sont les conteneurs Linux ?
  • Nos derniers articles Linux

Sur macOS, utilisez MacPorts ou Homebrew. Sous Windows, utilisez Chocolatey.

Si tout le reste échoue, vous pouvez l'installer manuellement à partir du code source sur Sourceforge.

Parser XML avec XMLStarlet

Il existe de nombreux outils conçus pour aider à analyser et transformer les données XML, y compris des bibliothèques de logiciels qui vous permettent d'écrire votre propre analyseur et des commandes complexes comme fop et xsltproc . Cependant, vous n'avez parfois pas besoin de traiter les données XML; vous avez juste besoin d'un moyen pratique d'extraire des données importantes, de les mettre à jour ou simplement de les valider. Pour les interactions XML spontanées, j'utilise xmlstarlet , une application classique de style "couteau suisse" qui effectue les tâches XML les plus courantes. Vous pouvez voir ce qu'il a à offrir en exécutant la commande avec le --help choix :

$ 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
[...]

Vous pouvez obtenir de l'aide supplémentaire en ajoutant --help à la fin de l'une de ces sous-commandes :

$ 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
[...]

Sélectionner des données avec sel

Vous pouvez afficher les données en XML avec le xmlstarlet select (sel pour faire court) commande. Voici un simple document XML :

<?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>

Lorsque vous recherchez des données dans un fichier XML, votre première tâche consiste à vous concentrer sur le nœud que vous souhaitez explorer. Si vous connaissez le chemin d'accès au nœud, spécifiez le chemin complet avec le --value-of option. Plus tôt vous commencez à explorer l'arborescence DOM (Document Object Model), plus vous voyez d'informations :

$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution \
--nl myfile.xml
      Fedora
      7
      Moonshine
     
        Live
        Fedora
        Everything     
     
      Fedora Core
      6
      Zod

Le --nl signifie "nouvelle ligne", et il insère de grandes quantités d'espaces blancs pour s'assurer que l'invite de votre terminal reçoit une nouvelle ligne après la réception de vos résultats. J'ai supprimé une partie de l'espace excédentaire dans l'exemple de sortie.

Affinez votre attention en descendant plus loin dans l'arborescence DOM :

$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution/name \
--nl myfile.xml
Fedora
Fedora Core

Sélections conditionnelles

L'un des outils les plus puissants pour naviguer et analyser XML s'appelle XPath. Il régit la syntaxe utilisée dans les recherches XML et appelle les fonctions des bibliothèques XML. XMLStarlet comprend les expressions XPath, vous pouvez donc rendre votre sélection conditionnelle avec une fonction XPath. XPath propose une multitude de fonctions, et il est documenté en détail par le W3C, mais je trouve la documentation XPath de Mozilla plus concise.

Vous pouvez utiliser des crochets comme fonction de test, comparant le contenu d'un élément à une certaine valeur. Voici un test pour la valeur du <name> élément, qui renvoie le numéro de version associé uniquement à une correspondance spécifique.

Imaginez un instant que l'exemple de fichier XML contient toutes les versions de Fedora commençant par 1. Pour afficher tous les numéros de version associés à l'ancien nom "Fedora Core" (le projet a supprimé "Core" du nom à partir de la version 7) :

$ xmlstarlet sel --template \
--value-of '/xml/os/linux/distribution[name = "Fedora Core"]/release' \
--nl myfile.xml
6
5
4
3
2
1

Vous pouvez également afficher tous les noms de code de ces versions en modifiant le --value-of chemin vers /xml/os/linux/distribution[name = "Fedora Core"]/codename .

Mettre en correspondance les chemins et obtenir des valeurs

L'un des avantages de l'affichage des balises XML en tant que nœuds est qu'une fois que vous avez trouvé le nœud, vous pouvez le considérer comme votre "répertoire" actuel de données. Ce n'est pas vraiment un répertoire, du moins pas au sens du système de fichiers, mais c'est une collection de données que vous pouvez interroger. Pour vous aider à garder votre destination et les données "à l'intérieur" séparées, XMLStarlet différencie ce que vous essayez de faire correspondre avec le --match option et la valeur des données que vous voulez avec un --value-of option.

Supposons que vous sachiez que le <spin> node contient plusieurs éléments. Cela en fait votre destination. Une fois que vous y êtes, vous pouvez utiliser --value-of pour spécifier l'élément pour lequel vous voulez une valeur. Pour regarder tous les éléments, utilisez un point (. ) pour représenter votre emplacement actuel :

$ xmlstarlet sel --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' --nl myfile.xml \
Live
Fedora
Everything

Comme pour la navigation dans le DOM, vous pouvez utiliser des expressions XPath pour limiter la portée des données renvoyées. Dans cet exemple, j'utilise le last() fonction pour récupérer uniquement le dernier élément du spin noeud :

$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[last()]' --nl myfile.xml
Everything

Dans cet exemple, j'utilise le position() fonction pour sélectionner un élément spécifique dans le spin noeud :

$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[position() = 2]' --nl myfile.xml
Fedora

Le --match et --value-of les options peuvent se chevaucher, c'est donc à vous de décider comment vous voulez les utiliser ensemble. Ces deux expressions, dans le cas de l'exemple XML, font la même chose :

$ 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

Se familiariser avec XML

XML peut parfois sembler trop verbeux et peu maniable, mais les outils conçus pour interagir avec lui me surprennent constamment. Si vous cherchez à tirer parti de XML, alors XMLStarlet pourrait être un bon point d'entrée. La prochaine fois que vous êtes sur le point d'ouvrir un fichier XML pour consulter des données structurées, essayez d'utiliser XMLStarlet et voyez si vous pouvez interroger ces données à la place. Plus vous serez à l'aise avec XML, mieux il pourra vous servir de format de données robuste et flexible.


Linux
  1. Copier des fichiers dans le terminal Linux

  2. Renommer un fichier dans le terminal Linux

  3. Déplacer des fichiers dans le terminal Linux

  4. Utilisez le terminal Linux pour naviguer dans votre ordinateur

  5. Utilisez le terminal Linux pour voir quels fichiers se trouvent sur votre ordinateur

Détendez-vous au coin du feu sur votre terminal Linux

Comment utiliser la commande Linux history

Comment utiliser la commande Linux xargs

Comment utiliser le terminal Linux dans Android

Comment analyser ou afficher le code XML dans la ligne de commande Linux

Utilisation de la commande grep sous Linux