【问题标题】:'-' changed to '_' while converting xml to hash in rails'-' 更改为 '_' 同时将 xml 转换为 rails 中的哈希
【发布时间】:2016-05-27 14:33:31
【问题描述】:

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 转换为 Hash 吗?

【问题讨论】:

  • 当我挖掘 Rails 源代码时,我认为这是不可能的它调用 XMLConverter 的 normalize_key 方法,将 '-' 替换为 '_' 。可能是其他任何人都可以阐明一些全局配置以防止这种情况发生
  • 显然你可以用一些哨兵值替换'-'并在转换后将其替换回'-'

标签: ruby-on-rails xml hash special-characters


【解决方案1】:

在第 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)
    

这个比较好,但是太长了,只是我的想法,欢迎大家评论!

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2016-08-26
    • 2015-01-04
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多