Cédric Temple

Administrateur système en logiciels libres

libxml2, jouer avec le XML en ligne de commande

2019-12-18 » notes pour plus tard

Ce contenu est fourni sous licence CC BY-NC-SA 4.0

Notes sur xmllint

Introduction

Les outils en ligne commande provenant de libxml2 permettent de se simplifier la vie lorsque l’on doit travailler sur des documents XML, notamment des fichiers de configuration XML. L’idée n’est pas ici de remplacer un programme ou un script (Python/Perl) qui va analyser en profondeur le fichier XML mais de pouvoir utiliser rapidement des commandes SHELL pour récupérer un élément dans un fichier XML. Ces commandes permettent aussi de valider un fichier XML, ce qui est utile dans, par exemple, les builds de jobs (Jenkins ou autre).

Installation

sudo apt-get install libxml2-utils

Extraire des données

Imaginons le fichier de configuration suivant :

<datasources>
  <local-tx-datasource>
    <jndi-name>MonDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/ma_jolie_base?characterEncoding=utf8&amp;characterSetResults=utf8&amp;jdbcCompliantTruncation=false</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>mon_utilisateur</user-name>
    <password>mon_password</password>
    <max-pool-size>40</max-pool-size>
    <blocking-timeout-millis>30000</blocking-timeout-millis>
  </local-tx-datasource>
</datasources>

Là, l’idée est d’extraire par exemple le mot de passe. Il est possible de le faire en utilisant le XPATH du document.

cedric@portable:~ xmllint --xpath '//datasources/local-tx-datasource/password/' config.xml
<password>mon_password</password>

On obtient une information mais elle n’est pas facile à utiliser en SHELL. En fait, il faut préciser le XPATH pour extraire la valeur du noeud XML à l’aide de text() :

cedric@portable:~ xmllint --xpath '//datasources/local-tx-datasource/password/text()' config.xml
mon_password

Bien entendu, il faut connaître le fonctionnement de XPATH pour obtenir les informations pertinentes comme il faut connaître le SQL pour accéder à une base de données relationnelles.

Pour récupérer le nom de la base de données, on recourt à des outils déjà connus :

cedric@portable:~ xmllint --xpath '//datasources/local-tx-datasource/connection-url/text()' config.xml | sed -e 's|.*:3306/||' -e 's:?.*::'
ma_jolie_base

Ce contenu est fourni sous licence CC BY-NC-SA 4.0