在Rails中将XML字符串转换为哈希

时间:2013-06-13 04:59:04

标签: ruby-on-rails ruby-on-rails-3

我使用了一些返回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 } }

这样做的方法是什么?

5 个答案:

答案 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"}}

https://github.com/eileencodes/actionpack-xml_parser