A l’époque où le JSON est roi, ce billet fait un peu tâche, non ? Pourtant le XML est toujours là, plutôt côté serveur, bien discret. Et même s’il n’est plus aussi populaire que le JSON, nous sommes parfois amené à le manipuler.

Pour tout ce qui est transformation de document, vous pouvoir aller voir du côté du bien connu XSL. Mais si vous souhaitez seulement explorer un XML pour y extraire simplement et rapidement des informations dans un script shell ou en ligne de commande, je ne saurais vous conseiller xmlstarlet.

Installation

$sudo apt-get install xmlstarlet

Usage

Imaginons que vous souhaitiez connaitre le nombre de billets disponibles sur le flux RSS de ce blog. Rien de plus simple :

$ curl -s -L https://blog.lecacheur.com/feed/ | xmlstarlet sel -t -v "count(//item)" -n
10

De même, si vous souhaitez lister les billets avec leur URL:

$ curl -s -L https://blog.lecacheur.com/feed/ | xmlstarlet sel -t -m "//item" -v title -o " : " -v "feedburner:origLink" -n
Le statique est la nouvelle dynamique : https://blog.lecacheur.com/2018/12/18/le-statique-est-la-nouvelle-dynamique/
Apache – bloquer l’accès HTTP à certains pays : https://blog.lecacheur.com/2018/11/27/apache-bloquer-lacces-http-a-certains-pays/
Installer un Raspberry Pi Zero sans périphérique : https://blog.lecacheur.com/2018/10/10/installer-un-raspberry-pi-zero-sans-peripherique/
Git – le b.a.-ba – mettre de côté son travail : https://blog.lecacheur.com/2018/06/14/git-le-b-a-ba-mettre-de-cote-son-travail/
Devoxx France 2018, encore et toujours ! : https://blog.lecacheur.com/2018/05/03/devoxx-france-2018-encore-et-toujours/
Swagger, OpenAPI ou OpenAPI Spec ? : https://blog.lecacheur.com/2018/02/20/swagger-openapi-ou-openapi-spec/
Debug d’une application web locale sur un mobile avec Chrome : https://blog.lecacheur.com/2018/01/16/debug-dune-application-web-locale-sur-un-mobile-avec-chrome/
Installer Scrapy sous Windows : https://blog.lecacheur.com/2017/12/28/installer-scrapy-sous-windows/
Le Nextbit Robin et le debugging USB : https://blog.lecacheur.com/2017/12/26/le-nextbit-robin-et-le-debugging-usb/
Tester en local les Firebase Functions : https://blog.lecacheur.com/2017/11/03/tester-en-local-les-firebase-functions/

Même si j’aurais tendance à préférer l’utilisation de cURL, xmlstarlet est capable de récupérer un document XML via une URL et l’option --net:

$ xmlstarlet sel --net -t -m "//item" -v title -n http://feeds.feedburner.com/LeWeblogueDeSeb
Le statique est la nouvelle dynamique
Apache – bloquer l’accès HTTP à certains pays
Installer un Raspberry Pi Zero sans périphérique
Git – le b.a.-ba – mettre de côté son travail
Devoxx France 2018, encore et toujours !
Swagger, OpenAPI ou OpenAPI Spec ?
Debug d’une application web locale sur un mobile avec Chrome
Installer Scrapy sous Windows
Le Nextbit Robin et le debugging USB
Tester en local les Firebase Functions

Il est bien évidemment possible de récupérer un élément particulier dans une liste, comme par exemple pour récupérer le titre du dernier billet publié :

$ xmlstarlet sel --net -t -m '//item[1]' -v title -n http://feeds.feedburner.com/LeWeblogueDeSeb
Le statique est la nouvelle dynamique

Il est également possible de manipuler des documents HTML avec l’option --html comme ceci :

$ xmlstarlet sel --net --html -t -m "//src" -v "@src" -n http://blog.lecacheur.com/

Cependant, je n’ai pas réussi à extraire des informations car il y avait régulièrement des erreurs HTML ou d’entités manquantes…

Conclusion

Nous avons vu comment extraire des données, qui est le cas le plus courant. Mais il faut savoir que xmlstarlet est une vraie boîte à outil pour le XML. Il est capable de modifier un document, d’appliquer des transformation XSL, de valider ou formatter un document, afficher la structure, etc…

xmlstarlet est donc un outil très simple qui peut se révéler très efficace quand il s’agit d’automatiser des traitements basés sur des informations stockées dans des documents XML.

A vos scripts bash !