GNU/Linux >> Tutoriels Linux >  >> Linux

Comment analyser XML et supprimer les balises à l'aide d'exemples XPATH sous Linux (Comment combiner plusieurs commandes à l'aide de PIPE sous Linux)

Ce didacticiel explique le processus de création de commandes utiles en plusieurs parties, pièce par pièce.

Pour créer des commandes complexes dans le terminal, nous devons comprendre la tuyauterie. La tuyauterie prend essentiellement la sortie d'une commande et l'envoie à une autre commande en entrée. Cela se fait avec le | symbole (tuyau).

Le mois dernier, un petit projet m'a obligé à lire à plusieurs reprises des fichiers XML similaires pour fournir des données de test à un autre programme. Je devrais le faire si souvent qu'il serait ennuyeux de devoir télécharger, enregistrer, analyser et répéter. Les exigences de base étaient :

  1. Obtenir le XML à partir de l'URL
  2. Analyser le XML et sélectionner seulement deux attributs de tous les éléments
  3. Supprimez les balises pour qu'il ne reste que le contenu
  4. Envoyer vers la sortie standard

1. Prouver que la ligne de commande peut analyser XML

J'avais utilisé la bibliothèque Ruby REXML::Xpath pour un script l'année dernière, et je me suis souvenu qu'il y avait une version Perl disponible sur la ligne de commande. Vous pouvez l'installer avec CPAN :

$ cpan XML::XPath

Utilisons un exemple de fichier d'employé pour jouer avec l'idée. Ouvrez ce fichier employee.xml dans un navigateur, ouvrez-le dans un navigateur et enregistrez-le sous employee.xml.

Nous avons maintenant notre commande xpath et un fichier avec lequel jouer.

Testez-le avec un chemin simple :

$ xpath employees.xml '/DIRECTORY/EMPLOYEE/FIRST_NAME'
­­ NODE ­­
<FIRST_NAME>Steven</FIRST_NAME>­­ NODE ­­
<FIRST_NAME>Susan</FIRST_NAME>­­ NODE ­­
<FIRST_NAME>Marigold</FIRST_NAME>­­ NODE ­­
...
<FIRST_NAME>Sunny</FIRST_NAME>­­ NODE ­­
<FIRST_NAME>Flo</FIRST_NAME>

Excellent! Il imprime l'attribut FIRST_NAME de chaque /EMPLOYEE sur le chemin sélectionné. Mais comment sélectionner plusieurs éléments XPath ? En regardant la syntaxe XPath, nous voyons un moyen. Combiner les expressions XPath avec le | caractère, nous créons une expression OR.

$ xpath employees.xml '/DIRECTORY/EMPLOYEE/ FIRST_NAME | /DIRECTORY/EMPLOYEE/LAST_NAME'
--­­ NODE ­­--
<FIRST_NAME>Steven</FIRST_NAME>­­-- NODE ­­--
<LAST_NAME>Sanguini</LAST_NAME>­--­ NODE ­--­
<FIRST_NAME>Susan</FIRST_NAME>­­-- NODE ­­--
<LAST_NAME>Aquilegia</LAST_NAME>--­­ NODE --­­
...
<FIRST_NAME>Flo</FIRST_NAME>­­-- NODE ­­--
<LAST_NAME>Lobalessia</LAST_NAME>

Avis, ici | est interprété comme l'opérateur OR et non comme une redirection de sortie.

De plus, dans cette instruction, nous sélectionnons X ainsi que Y. Pourquoi OU sélectionne-t-il les deux ? Il évalue chaque nœud du document XML séparément et si le nœud est A ou B, il réussit l'évaluation et est transmis à la sortie.

2. Télécharger XML et envoyer à STDOUT

Cette prochaine étape va en fait venir plus tôt sur la ligne de commande et nous la construirons séparément. Je préfère construire d'abord les entrées de commande les plus difficiles, ou "vous ne pouvez pas faire ça", comme preuve de concept. Il serait inutile de faire le travail de ligne de commande environnant si la première étape ne peut pas fonctionner.

cURL est une commande puissante pour les interactions HTTP. Ces exemples de boucles vous permettront de démarrer dans la bonne direction.

Nous spécifions un emplacement, en suivant les redirections si besoin. Pour cela, utilisez cette option :-L ‘https://www.thegeekstuff.com/scripts/employees.xml’

Nous désactivons la sortie d'informations de cURL. Et spécifiez le protocole GET. Pour cela, utilisez cette option :-s G

Testons donc notre commande sur l'URL du fichier téléchargé précédemment :

$ curl -­s -­G -­L ' https://www.thegeekstuff.com/scripts/employees.xml'
<?xml version="1.0" encoding="UTF­8"?>
<DIRECTORY>
<EMPLOYEE>
<FIRST_NAME>Steven</FIRST_NAME>
<LAST_NAME>Sanguini</LAST_NAME>
<STORE_NUMBER>4</STORE_NUMBER>
<SHIFT>FIRST</SHIFT>
<AUM>$2.44</AUM>
<ID>031599</ID>
</EMPLOYEE>
..

Il est par défaut à STDOUT. Ce qui tombe bien puisqu'on va maintenant le rediriger vers XPath en supprimant l'argument file :

$ curl ­-s -­G -­L ' https://www.thegeekstuff.com/scripts/employees.xml' | xpath \
'/DIRECTORY/EMPLOYEE/LAST_NAME | /DIRECTORY/EMPLOYEE/ID'
­--­ NODE ­­--
<LAST_NAME>Sanguini</LAST_NAME>­­-- NODE ­­--
<ID>031599</ID>­­ NODE ­­
<LAST_NAME>Aquilegia</LAST_NAME>­­-- NODE -- ­­
<ID>030699</ID>­­-- NODE ­­--
...
<LAST_NAME>Lobalessia</LAST_NAME>--­­ NODE --­­
<ID>022299</ID>

Cela produit la sortie attendue. Super! Je ne sais pas pourquoi, mais XPath envoie "NODE" à l'erreur standard (STDERR). Mais nous verrons une raison possible plus tard.

3. Supprimer les balises XML

Maintenant, nous devons pouvoir supprimer ces balises et obtenir uniquement le contenu. Sed est le meilleur outil pour effectuer des substitutions d'expressions régulières à la volée. L'apprentissage de REGEX sort du cadre de cet article.

Veuillez consulter notre série d'articles sur les expressions régulières Python pour plus d'informations.

Lors de la création de commandes compliquées avec plusieurs arguments et drapeaux, je trouve préférable de travailler avec un exemple simple jusqu'à ce que je l'obtienne parfaitement, puis de le coller dans le contexte avec les vrais arguments. Nous dirigeons une chaîne simple vers sed pour une substitution de test. Sed fonctionne sur STDIN par défaut.

$ echo "This<strong> is </strong>a test." | sed ­-re 's/i//g'
Ths<strong> s </strong>a test.

D'accord. Ça marche. Réécrivez maintenant la recherche pour remplacer une balise.

$ echo "This<strong> is </strong>a test." | sed ­-re 's/<\w+>//g'
This is </strong>a test.

Bien. Supprimons la balise de fermeture en ajoutant '/' échappé en préfixant '\' et rendu facultatif en suffixant '?'

$ echo "This<strong> is </strong>a test." | sed ­re 's/<\/?\w+>//g'
This is a test.

Parfait. Exactement ce à quoi nous nous attendions.

4. Tout mettre ensemble

Maintenant que nous avons créé les parties individuelles de notre commande, nous les collons ensemble dans un ordre logique rejoint par | .

curl ­-s -­G -­L ' https://www.thegeekstuff.com/scripts/employees.xml' | \
xpath '/DIRECTORY/EMPLOYEE/LAST_NAME | /DIRECTORY/EMPLOYEE/ID ' | \
sed ­-re 's/<\/?\w+>//g'

Sortie :

Found 72 nodes:
--­­ NODE -- ­­
­--­ NODE ­­--
...
Sanguini031599Aquilegia030699...

Oh oh ! C'est peut-être pour cette raison que les marqueurs " NODE " sont là. Si nous dirigeons ceci vers un fichier, le texte NODE ne suit pas. Ils sont envoyés à l'erreur standard (STDERR), mais nous pouvons rediriger vers STDOUT en utilisant `2>&1` (explication) et utiliser le substitut sed `sed re 's/ NODE //g'` pour supprimer de la même manière que le balises.

curl -­s -­G -­L 'https://www.thegeekstuff.com/scripts/employees.xml' | \
xpath '/DIRECTORY/EMPLOYEE/LAST_NAME | /DIRECTORY/EMPLOYEE/ID '
2>&1| sed -­re 's/­--­NODE--­­//g' | sed -­re 's/<\/?\w+>//g'

Sortie :

Found 72 nodes:
Sanguini
031599
Aquilegia
030699
...
Lobalessia
022299

Parfait. Maintenant, pendant que je travaille sur mon projet, je peux rapidement obtenir des exemples de données à partir de fichiers XML sur le Web vers STDOUT sans avoir à enregistrer des fichiers ou à exécuter un logiciel compliqué. Nous pouvons même diriger cela vers `tail –n+3` pour couper ces deux premières lignes de réponse.

Cet article n'est qu'un exemple des différentes choses que vous pouvez faire si vous apprenez à combiner plusieurs commandes à l'aide de pipe.


Linux
  1. Comment utiliser les commandes 'cat' et 'tac' avec des exemples sous Linux

  2. Commandes Linux - Présentation et exemples

  3. Vérifier l'espace disque sous Linux à l'aide des commandes df et du

  4. Commandes tête et queue sous Linux expliquées avec des exemples

  5. Comment utiliser les canaux et les canaux nommés sous Linux (avec exemples)

Comment exécuter des commandes à partir d'une entrée standard à l'aide de Tee et Xargs sous Linux

Comment afficher les feuilles de triche des commandes Linux en utilisant par exemple

Comment utiliser les commandes Pbcopy et Pbpaste sous Linux

Comment sauvegarder des fichiers et des répertoires à l'aide de Rsync sous Linux

Comment exécuter des applications Linux sur Windows 10 et 11 à l'aide de WSL

Comment exécuter plusieurs commandes Linux en une seule commande