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?
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