我使用了一些返回xml的服务:
response = HTTParty.post(service_url)
response.parsed_response
=> "\n\t<Result>\n<success>\ntrue\n</success>\n</Result>"
我需要将此字符串转换为哈希值。像这样:
response.parsed_response.to_hash
=> {:result => { :success => true } }
这样做的方法是什么?
答案 0 :(得分:33)
内置的from_xml
Rails Hash
方法可以完全按照您的要求进行操作。为了让您的response.parsed_response
正确映射到哈希值,您需要gsub()
出现换行符:
hash = Hash.from_xml(response.parsed_response.gsub("\n", ""))
hash #=> {"Result"=>{"success"=>"true"}}
在Rails中解析哈希的上下文中,从一般编程角度来看,String
类型的对象比Symbol
的对象更not substantively different。但是,您可以将Rails symbolize_keys
方法应用于输出:
symbolized_hash = hash.symbolize_keys
#=> {:Result=>{"success"=>"true"}}
如您所见,symbolize_keys
不能对任何嵌套哈希进行操作,但您可能会迭代内部哈希并应用symbolize_keys
。
最后一个难题是将字符串"true"
转换为布尔值true
。 AFAIK,你的哈希没有办法做到这一点,但如果你在迭代/操作它,你可能会实现像suggested in this post那样的解决方案:
def to_boolean(str)
return true if str == "true"
return false if str == "false"
return nil
end
基本上,当您到达内部键值对时,您会将to_boolean()
应用于当前设置为"true"
的值。在您的示例中,返回值是布尔值true
。
答案 1 :(得分:10)
使用nokogiri解析对ruby哈希的XML响应。它很快。
require 'active_support/core_ext/hash' #from_xml
require 'nokogiri'
doc = Nokogiri::XML(response_body)
Hash.from_xml(doc.to_s)
答案 2 :(得分:2)
您可以尝试以下方法:
require 'active_support/core_ext/hash/conversions'
str = "\n\t<Result>\n<success>\ntrue\n</success>\n</Result>".gsub("\n", "").downcase
Hash.from_xml(str)
# => {"result"=>{"success"=>"true"}}
答案 3 :(得分:2)
使用gem Nokogir
doc = Nokogiri::XML(xml_string)
data = doc.xpath("//Result").map do |result|
[
result.at("success").content
]
end
这些tutorials可能会对您有所帮助。
答案 4 :(得分:0)
我发现了一个可以做到这一点的宝石:
gem 'actionpack-xml_parser'
基本上,每个节点代表一个键。使用以下 XML:
<person><name>David</name></person>
结果参数为:
{"person" => {"name" => "David"}}