2010-07-20 13 views
2

Je dispose d'un fichier avec la structure suivanteSélectionnez attribut du nœud avec XPath

<admin> 
<sampleName>Willow oak leaf</sampleName> 
<sampleDescription comment="Total genes"> 
    <cvParam cvLabel="Bob" accession="123" name="Oak" />  
</sampleDescription> 
</admin> 

Je suis en train de faire sortir le texte « gènes total » après le commentaire de sampleDescription, et je l'ai utilisé le code suivant:

sampleDescription = doc.xpath("/admin/Description/@comment") 
sampleDescription = doc.xpath("/admin/Description").text 

Mais ni l'un ni l'autre ne fonctionnent. Qu'est-ce que je rate?

Répondre

0

doc.xpath retourne un NodeSet qui agit un peu comme un tableau. Donc, vous devez saisir le premier élément

doc.xpath("//admin/sampleDescription").first['comment'] 

Vous pouvez également utiliser at_xpath ce qui équivaut à xpath(foo).first

doc.at_xpath("//admin/sampleDescription")['comment'] 

Une autre chose à noter est que les attributs sur les nœuds sont accessibles comme éléments de hachage - avec [<key>]

1

peut-être une faute de frappe ... avez-vous essayé doc.xpath("/admin/sampleDescription/@comment").text?

+0

Oui, ça ne marche pas non plus. D'autres suggestions? – Bobby

+0

étrange - qu'en est-il de 'doc.css ('sampleDescription [comment]'). D'abord ['comment']', sinon quelle version de Nokogiri et Ruby avez-vous installée? – lwe

1

Cela ne fonctionne pas car il n'y a pas d'élément Description. Comme mentionné par Iwe, vous devez faire quelque chose comme sampleDescription = doc.xpath("/admin/sampleDescription/@comment").to_s

Aussi, si c'était moi, je voudrais juste faire sampleDescription = doc.xpath("//sampleDescription/@comment").to_s. C'est un xpath plus simple, mais il pourrait être plus lent.

Et à noter, quelque chose qui trébuche beaucoup de gens sont des espaces de noms. Si votre document XML utilise des espaces de noms, faites sampleDescription = doc.xpath("/xmlns:admin/sampleDescription/@comment").to_s. Si votre document utilise des espaces de noms et que vous ne le spécifiez pas avec xmlns:, Nokogiri ne retournera rien.

1

Essayez ceci:

doc.xpath("//admin/sampleDescription/@comment").to_s 
+0

Mise à jour de la réponse avec la syntaxe correcte. –

+0

Notez que 'xpath' renvoie un ensemble de noeuds, pas un seul noeud. – Phrogz