2010-11-02 4 views
0

J'ai un fichier XML complexe, et je veux en extraire le contenu d'un tag spécifique. J'utilise un script ruby ​​avec XmlSimple gem. Je récupère un fichier XML avec une requête HTTP, puis je supprime toutes les balises inutiles et j'en retire les informations nécessaires. C'est le script lui-même:Manipuler des fichiers XML dans ruby ​​avec XmlSimple

data = XmlSimple.xml_in(response.body) 
hash_1 = Hash[*data['results']] 


def find_value(hash, value) 
    hash.each do |key, val| 
    if val[0].kind_of? Hash then 
     find_value(val[0], value) 
    else 
     if key.to_s.eql? value 
     puts val 
     end 
    end 
    end 
end 

hash_1['book'].each do |arg| 
    find_value(arg, "title") 
    puts("\n") 
end 

Le problème est que lorsque je change remplacer puts val avec return val, puis appelez find_value méthode avec puts find_value (arg, "title"), je reçois tout le contenu de hash_1 [livre] sur l'écran.

Comment corriger la méthode find_value?

Répondre

1

Un "fichier XML complexe" et XmlSimple ne se mélangent pas. Votre tâche sera résolue beaucoup plus facilement avec Nokogiri, et sera plus rapide aussi:

require 'nokogiri' 
doc = Nokogiri::XML(response.body) 

puts doc.xpath('//book/title/text()') 
+0

Oui, il semble que je viens d'utiliser une mauvaise gemme pour cette tâche. Merci) –