Mon préféré est xmlstarlet car il semble être plus puissant que xmllint :
xmlstarlet sel -t -v '/resources/item[@id="index.php"]/description/text()' en.xml
la meilleure façon de cibler un élément spécifique, puis d'accéder à son élément enfant
L'expression XPath correcte pour ce faire est :
/resources/item[@id="index.php"]/description/text()
En clair :commencez par le nœud de document, jusqu'à l'élément de document resources
, sur son enfant item
, mais seulement si la valeur de id
l'attribut est "index.php", sur son enfant description
et récupérer sa valeur textuelle.
J'utilise xmllint pour valider les documents XML, mais jamais pour les expressions de chemin. Dans un shell bash (au moins avec Mac OS), il existe un outil encore plus simple pour évaluer les expressions XPath, appelé "xpath":
$ xpath en.xml '/resources/item[@id="index.php"]/description/text()'
Ensuite, le résultat suivant est obtenu :
Found 1 nodes:
-- NODE --
DESCRIPTION
Si vous préférez toujours xmllint, utilisez-le de la manière suivante :
$ xmllint --xpath '/resources/item[@id="index.php"]/description/text()' en.xml > result.txt
Par défaut, --xpath
implique --noout
, ce qui empêche xmllint de générer le fichier XML d'entrée. Pour rendre la sortie plus lisible, je redirige la sortie vers un fichier.
$ cat result.txt
DESCRIPTION