2013-06-13 7 views
11

I stosując pewną usługę, która zwraca xml:Konwersja XML ciąg hash w Rails

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

Trzeba przekonwertować ten ciąg do mieszania. Coś takiego:

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

Jaki sposób to zrobić?

+1

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

Odpowiedz

27

Wbudowany from_xml Railsy Hash Metoda zrobi dokładnie to, co chcesz. W celu zdobycia response.parsed_response prawidłowo odwzorowane do mieszania, musisz gsub() się z nowymi liniami:

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

w kontekście analizowania hash w Rails, przedmioty String typu są not substantively different niż Symbol od ogólna perspektywa programowania. Jednakże, można zastosować metodę Rails symbolize_keys do wyjścia:

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

Jak widać, symbolize_keys nie działa na wszystkich zagnieżdżonych skrótów, ale potencjalnie mogłyby iterację wewnętrznych mieszań i zastosować symbolize_keys.

Ostatnim elementem układanki jest zamiana ciągu "true" na boolean true. AFAIK, nie ma sposobu, aby to zrobić na hash w miejscu, ale jeśli iteracji/działających na nim, można potencjalnie wdrożyć rozwiązanie jak ten suggested in this post:

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

Zasadniczo, po osiągnięciu wewnętrzna para klucz-wartość, należy zastosować to_boolean() do wartości, która jest obecnie ustawiona na "true". W twoim przykładzie wartością zwracaną jest boolean true.

+0

Proszę spojrzeć na to w moim poście dzięki –

2

Można spróbować to poniżej: -

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

Output: - co mam

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

Dzięki

+0

Dzięki za tym require korzystać w Ruby poza szynami! – andreofthecape

2

użycie gem Nokogir

doc = Nokogiri::XML(xml_string) 

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

tutorials może pomóc.

+0

nadzieję, że nie da dokładnego hasza, ponieważ mam '# ]>]>]> ' –

+0

zaktualizowałem moją odpowiedź. Tty to. – rony36

10

Użyj funkcji nokogiri do przeanalizowania odpowiedzi XML na wartość mieszania ruby. Jest dość szybki.

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

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