web-dev-qa-db-fra.com

XMLLint Valeurs d'affichage de plus de 1 attributs en exécution unique

J'utilise Xmllint pour analyser le fichier XML qui comporte plusieurs balises et chaque balise comporte plusieurs attributs. Structure d'échantillonnage comme indiqué ci-dessous:

<root>
   <child attr1="abc" attr2="def" attr3="ghi" />
   ...
   ...
</root>

J'ai besoin d'aller chercher les valeurs des attributs attr1, attr2 et attr3.

Jusqu'à présent, j'ai essayé ce qui suit qui donne parfaitement les données d'un attribut

echo 'cat //root/child/@attr1' | xmllint --Shell data.xml 

Cette sortie

attr1="abc"

Donc, ma question est, comment pouvons-nous spécifier plus d'un attributs de la chaîne pour obtenir la sortie requise comme

attr1="abc"
attr2="def"
attr3="ghi"

J'ai essayé ce qui suit pour cela, mais pas de bon résultat:

echo 'cat //root/child/@*[attr1|attr2|attr3]' | xmllint --Shell data.xml 
echo 'cat //root/child/@*[attr1 or attr2 or attr3]' | xmllint --Shell data.xml 

la production ci-dessus était que l'instruction ECHO a été rééchée à nouveau, cela signifie que le XMLLINT ne l'a pas accepté comme entrée.

Des idées sur la façon d'y aller?

5
mtk

Autant que je sache le | Séparateur ne peut être utilisé que sur des chemins entiers:

echo 'cat /root/child/@attr1|/root/child/@attr2|/root/child/@attr3' | xmllint --Shell data.xml

(Comme // signifie à n'importe quelle profondeur, "// racine" met l'analyseur à un travail supplémentaire sans point. En supposant que votre échantillon XML semble une structure similaire comme la vraie (donc root est en effet le nœud racine du XML), une meilleure utilisation "/ racine/enfant".)

Ou vous pouvez utiliser une expression avec des fonctions XPath:

echo 'cat /root/child/@*[name()="attr1" or name()="attr2" or name()="attr3"]' | xmllint --Shell data.xml

Si vous avez besoin de tous les attributs avec le nom "attr *", vous pouvez utiliser une expression générique:

echo 'cat /root/child/@*[starts-with(name(),"attr")]' | xmllint --Shell data.xml
6
manatwork