Aller au contenu principal

L'utilitaire xmlstarlet pour Linux

Maîtrisez la manipulation de données XML en ligne de commande avec xmlstarlet. Ce guide montre comment embellir une sortie XML et filtrer des nœuds avec des expressions XPath

· 4 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Journal des modifications

Dernière
added a Docker-first demo to try before installing

L'utilitaire xmlstarlet pour Linux

⚡
TL;DR

Cet article présente xmlstarlet, l'équivalent de jq pour le XML : formater un XML minifié avec xmlstarlet format --indent-spaces 4, et extraire ou filtrer des nœuds avec des expressions XPath via xmlstarlet sel -t -v, y compris des filtres sur attribut comme //book[@category='children']/title.

xmlstarlet est un utilitaire puissant pour Linux qui permet de manipuler des données XML depuis la ligne de commande et qui s'intègre dans vos scripts shell. Il est au XML ce que jq est au JSON.

Avec xmlstarlet, vous pouvez embellir une sortie XML mais aussi la filtrer, par exemple pour n'afficher qu'un nœud donné.

Un mur de XML en entrée, un mot en sortie​

Voici le fichier avec lequel nous allons jouer, data.xml, exactement tel qu'une machine l'aurait écrit : tout sur une seule ligne, aucun formatage.

<?xml version="1.0" encoding="UTF-8"?><bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="children"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="web"><title lang="en">XQuery Kick Start</title><author>James McGovern</author><author>Per Bothner</author><author>Kurt Cagle</author><author>James Linn</author><author>Vaidyanathan Nagarajan</author><year>2003</year><price>49.99</price></book><book category="web"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book></bookstore>

Ce fichier XML définit un catalogue de livres avec une structure hiérarchique : un élément racine bookstore contient plusieurs éléments book, chacun ayant des attributs (category) et des enfants (title, author, year, price) qui décrivent les propriétés du livre. C'est un exemple classique de données structurées en XML montrant comment organiser des collections d'objets similaires.

Posons-lui maintenant une question : donne-moi le titre du livre classé dans la catégorie children.

>user@machine: ~/yourproject

Une commande, une réponse, et pas une seule ligne de code de parsing.

Embellir le fichier​

La deuxième chose que vous utiliserez tous les jours : rendre ce mur lisible, grâce à l'action format.

>user@machine: ~/yourproject
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

Ce fichier XML représente un catalogue de librairie contenant plusieurs livres avec leurs métadonnées. Chaque livre est défini par une catégorie, un titre, un ou plusieurs auteurs, une année de publication et un prix. La structure permet de stocker et d'organiser des informations sur des ouvrages de différents genres.

Le voir à l'œuvre avec Docker​

Avant d'installer quoi que ce soit, essayez les deux commandes ci-dessus dans un container jetable — data.xml, exactement le même fichier que celui montré en haut de cet article, vous attend déjà dans le répertoire de travail.

Pourquoi Docker d'abord ?

Le Dockerfile ci-dessous installe xmlstarlet et écrit data.xml pour vous. Rien à créer, coller ou télécharger — il n'y a plus qu'à envoyer le fichier dans xmlstarlet.

Construisez l'image et lancez-la :

>user@machine: ~/xmlstarlet-demo

$ docker build -t xmlstarlet-demo . [+] Building 9.4s (6/6) FINISHED ✔ exporting to image

$ docker run --rm -it xmlstarlet-demo 🐳 root ~/demo # cat data.xml | xmlstarlet sel -t -v "//book[@category='children']/title"

Harry Potter

Même fichier, même filtre, même réponse — pas de mkdir, pas de copier-coller de XML dans un nouveau fichier. Essayez ensuite cat data.xml | xmlstarlet format --indent-spaces 4 pour voir la version embellie, ou modifiez l'expression XPath pour récupérer un autre nœud.

Installer xmlstarlet​

Pour vérifier si xmlstarlet est déjà installé sur votre système, lancez simplement which xmlstarlet. Si vous obtenez xmlstarlet not found comme réponse :

Prérequis : xmlstarlet

>user@machine: ~/yourproject

Vérifier :

>user@machine: ~/yourproject

À vous de jouer​

Pour reproduire les deux commandes ci-dessus sur votre machine, ouvrez un shell Linux et lancez mkdir -p /tmp/xmlstarlet && cd $_, puis créez un fichier data.xml avec le contenu affiché en haut de cet article.

Comprendre l'expression XPath​

Une expression XPath n'est qu'un chemin dans l'arbre. Notre nœud racine s'appelle bookstore, ensuite nous avons un ou plusieurs book et chaque livre a un title :

<!-- highlight-next-line -->
<bookstore>
<!-- highlight-next-line -->
<book category="cooking">
<!-- highlight-next-line -->
<title lang="en">Everyday Italian</title>
[...]
</book>
[...]
</bookstore>

Ce snippet montre la structure d'un document XML représentant une librairie. L'élément racine bookstore contient des éléments book, chacun ayant des attributs (comme category) et des enfants (comme title avec son propre attribut lang). Les commentaires highlight-next-line indiquent probablement que ce fichier est utilisé pour la documentation ou la mise en évidence syntaxique.

Parcourez ce chemin depuis la racine et vous obtenez tous les titres du fichier :

>user@machine: ~/yourproject

L'expression utilisée au début de cet article, //book[@category='children']/title, en est la version filtrée : donne-moi chaque book, peu importe où le nœud se trouve (c'est le préfixe //), mais uniquement s'il possède un attribut nommé category dont la valeur est children. Puis, si trouvé, affiche son title.

Conclusion​

Deux actions couvrent l'essentiel des besoins quotidiens : format pour rendre un fichier XML lisible par un humain, et sel -t -v avec une expression XPath pour en extraire exactement le nœud voulu. Les deux s'utilisent dans un pipe, donc les deux s'utilisent dans un script shell.

Consultez la documentation officielle pour en apprendre plus sur xmlstarlet, et si votre prochain fichier est un .json, l'utilitaire jq pour Linux raconte exactement la même histoire avec une syntaxe différente.


Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?