在将 xml 转换为 rails 中的散列时,'-' 更改为 '_'

'-' changed to '_' while converting xml to hash in rails

xml = "<outer-tag><inner-tag>value</inner-tag></outer-tag>"

hash = Hash.from_xml(xml) ==> 这给了我以下输出

{"outer_tag"=>{"inner_tag"=>"value"}}

我实际上需要 hash = {"outer-tag"=>{"inner-tag"=>"value"}}

有什么方法可以将XML转换成哈希而不用把“-”改成“_”吗?

让我们检查第 164 行的 source code。Rails 将散列键从 - 规范化为 _

所以,我想出了两个解决方案:

  1. 调用rails私有方法

    xml = "<outer-tag><inner-tag>value</inner-tag></outer-tag>"
    hash = ActiveSupport::XmlMini.parse(xml)
    result = ActiveSupport::XMLConverter.new("").send(:deep_to_h, hash)
    

这是有风险的,因为rails可能有内部变化,我们很容易出错

  1. 将密钥从 _ 转换回 -

    xml = "<outer-tag><inner-tag>value</inner-tag></outer-tag>"
    hash = Hash.from_xml(xml)
    normalize_keys = -> (params) do
      case params
        when Hash
          Hash[params.map { |k,v| [k.to_s.tr('_', '-'), normalize_keys.call(v)] } ]
        when Array
          params.map { |v| normalize_keys.call(v) }
        else
          params
      end
    end
    result = normalize_keys.call(hash)
    

这个更好,但是太长了,只是我的想法,欢迎任何评论!