2013-06-13 10 views
11

ich einen Dienst verwenden, die XML zurückgibt:Convert XML-String in Rails Hash

response = HTTParty.post(service_url) 
response.parsed_response 
=> "\n\t<Result>\n<success>\ntrue\n</success>\n</Result>" 

Ich brauche diese Zeichenfolge zu konvertieren Hash. Etwas wie dieses:

response.parsed_response.to_hash 
=> {:result => { :success => true } } 

Welchen Weg, dies zu tun?

+1

http://www.railstips.org/blog/archives/2008/08/11/parsing-xml-with-ruby/ –

Antwort

27

Der eingebaute in from_xml Schienen Hash Methode wird genau das tun, was Sie wollen. Um Ihre response.parsed_response korrekt auf einen Hash zugeordnet zu bekommen, die Sie gsub() aus den Zeilenumbrüche brauchen werden:

hash = Hash.from_xml(response.parsed_response.gsub("\n", "")) 
hash #=> {"Result"=>{"success"=>"true"}} 

Im Rahmen eines Hash in Rails zu parsen, Objekte von String Typ sind not substantively different als die von Symbol aus eine allgemeine Programmierperspektive. Sie können jedoch die Schienen symbolize_keys Methode mit dem Ausgang gilt:

symbolized_hash = hash.symbolize_keys 
#=> {:Result=>{"success"=>"true"}} 

Wie Sie sehen können, symbolize_keys nicht auf irgendwelchen verschachtelten Hashes funktioniert, aber man könnte möglicherweise durch innere Hashes iterieren und symbolize_keys gelten.

Das letzte Teil des Puzzles ist die Zeichenfolge "true" in den booleschen true zu konvertieren. AFAIK, gibt es keine Möglichkeit, dies an Ort und Stelle auf dem Hash zu tun, aber wenn Sie Iterieren/Betrieb auf sie, man könnte möglicherweise eine Lösung wie die suggested in this post implementieren:

def to_boolean(str) 
    return true if str == "true" 
    return false if str == "false" 
    return nil 
end 

Grundsätzlich, wenn Sie die innere erreichen Schlüssel-Wert-Paar, wenden Sie to_boolean() auf den Wert, der derzeit auf "true" festgelegt ist. In Ihrem Beispiel ist der Rückgabewert der boolesche Wert true.

+0

Bitte schauen Sie auf meinem Beitrag danke –

2

Sie können dies unten probieren: -

require 'active_support/core_ext/hash/conversions'
Hash.from_xml "\n\t<Result>\n<success>\ntrue\n</success>\n</Result>".gsub("\n", "").downcase

Ausgang: - , was ich habe

{"result"=>{"success"=>"true"}}

Dank

+0

Dank für die in Ruby außerhalb Schienen zu verwenden, die erfordern, einschließlich! – andreofthecape

2

Verwendung gem Nokogir

doc = Nokogiri::XML(xml_string) 

data = doc.xpath("//Result").map do |result| 
    [ 
    result.at("success").content 
    ] 
end 

Diese tutorials Ihnen helfen können.

+0

hoffe, es wird nicht genau Hash geben, wie ich bekam # # Nokogiri :: XML :: Dokument: 0x16e3790 name = "Dokument" children = [# ]>]>]> ' –

+0

aktualisierte meine Antwort. Tty das. – rony36

10

Verwenden Sie nokogiri, um die XML-Antwort auf Ruby-Hash zu analysieren. Es ist ziemlich schnell.

require 'active_support/core_ext/hash' #from_xml 
require 'nokogiri' 

doc = Nokogiri::XML(response_body) 
Hash.from_xml(doc.to_s)