2009-12-09 3 views
0

Je souhaite extraire un attribut d'un arbre XML. Pour cela, j'utilise la commande xpath du paquetage libxml-xpath-perl. Je me suis dit cette commande:Sélection de la valeur avec la commande Linux xpath (à partir de Perl)

virsh dumpxml save | xpath -e "/domain/devices/disk[@type='file']/source/@file[1]" 

Cela me donne

file="/var/lib/libvirt/images/save.raw" 

Comment puis-je sélectionner la valeur uniquement? (/var/lib/libvirt/images/save.raw)

Merci

Falstaff

Répondre

2

J'utilise (peut-être parce que je l'ai écrit; -) xml_grep2, de App::xml_grep2, qui a une option -t pratique qui renvoie la valeur texte du résultat:

virsh dumpxml save | xml_grep2 -t "/domain/devices/disk[@type='file']/source/@file[1]" 

devrait fonctionner

0

Vous voulez séparer la chaîne en fonction de la =, utilisez donc split (perldoc -f split):

my ($attr, $value) = split /=/, 'file="/var/lib/libvirt/images/save.raw"'; 

Toutefois, au lieu d'analyser ces valeurs littéralement, vous devez utiliser les nombreuses bibliothèques d'analyseurs XML, telles que XML::XPath.

+0

Sa la solution que je l'utilise maintenant dans mon bashscript, divisant litterally en utilisant cut -d = -f 2, mais je veux utiliser la fonction XPath pour elle, quelque chose comme virsh $ dumpxml sauver 2>/dev/n ull | xpath -e "valeur (/ domaine/périphériques/disque [@ type = 'fichier']/source/@ fichier [1])" ... – falstaff

0
/domain/devices/disk[@type='file']/source/@file[1]/text() 
+0

Cela me donne: $ virsh dumpxml enregistrer 2>/dev/null | xpath -e "/ domaine/périphériques/disque [@ type = 'fichier']/source/@ fichier [1]/texte()" Aucun noeud trouvé dans stdin – falstaff

+0

Hm, les nœuds de texte évidemment nus ne peuvent pas être traités/affichés. C'était juste une supposition de ma part, certes. – Tomalak

0

Je pense que retourner uniquement la valeur est un comportement normal. Peut-être que c'est un bug? J'ai essayé /text() comme Tomalak suggéré et il ne retourne rien (au moins avec cet outil).
Vous pourriez maintenant redirigez la sortie dans une autre commande comme sed pour obtenir le résultat souhaité:

... | sed -r 's/.*?"(.*)"/\1/' 

Edit:
Apparemment, le script Perl utilise XML::XPath et utilise uniquement find pour la requête qui retourne un objet NodeSet . Mais il y a aussi findvalue que le script n'utilise pas. Peut-être que vous pourriez bidouiller un peu avec le script. Remplacer seulement find par findvalue donne juste la valeur sur stdout, mais aussi les messages d'erreur sur stderr.
Doc pour la bibliothèque: https://metacpan.org/pod/XML::XPath

+0

Ouais c'est un peu comme je l'utilise maintenant ... Je voudrais juste le faire dans le chemin xpath ... couper -d = -f 2 – falstaff

Questions connexes