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.