没有ActiveSupport的Hash.from_xml?

时间:2018-06-16 16:57:58

标签: ruby

在没有ActiveSupport依赖关系的情况下,任何人都知道将XML转换为哈希的便捷方法吗? ActiveSupport确实有Hash.from_xml,但是避免使用ActiveSupport?

1 个答案:

答案 0 :(得分:0)

如果您不想要整个Active Support库,gyoku gem可能会有所帮助。

Gyoku.xml(:find_user => { :id => 123, "v1:Key" => "api" })

还有to_xml gem,它使用Hash方法扩展#to_xml对象。快速说明:这个to_xml gem似乎与Ruby on Rails不兼容。

此外,如果您不想添加任何宝石,您可以自己定义序列化:

module Xml
  extend self

  def serialize(object)
    object.map do |key, value|
      noderize(key, value)
    end
  end

  def noderize(key, value)
    if value.class == Hash
      node_value = serialize(value).join
    else
      node_value = value.nil? ? "" : value
    end

    "<#{key}>#{node_value}</#{key}>"
  end
end

puts Xml.serialize({
  name: "Vinicius",
  username: "vnbrs",
  address: {
    country: {
      name: "Brazil",
      dial_code: 55
    },
    street: "R Jose Ananias Mauad",
    street_number: nil,
  }
})

那产出:

<name>Vinicius</name>
<username>vnbrs</username>
<address>
    <country>
        <name>Brazil</name>
        <dial_code>55</dial_code>
    </country>
    <street>R Jose Ananias Mauad</street>
    <street_number></street_number>
</address>