Ruby on rails '-';更改为'_';在rails中将xml转换为哈希时

Ruby on rails '-';更改为'_';在rails中将xml转换为哈希时,ruby-on-rails,xml,hash,special-characters,Ruby On Rails,Xml,Hash,Special Characters,xml=“值” hash=hash.from_xml(xml)==>这给了我以下输出 {“外部标签”=>{“内部标签”=>“值”} 我实际上需要hash={“外部标记”=>{“内部标记”=>“值”} 是否有任何方法可以将XML转换为哈希而不将“-”更改为“”?让我们在第164行检查一下。Rails将散列键从-规范化为 因此,我提出了两种解决方案: 调用rails私有方法 xml = "<outer-tag><inner-tag>value</inner-tag>

xml=
“值”

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

{“外部标签”=>{“内部标签”=>“值”}

我实际上需要hash={“外部标记”=>{“内部标记”=>“值”}

是否有任何方法可以将XML转换为哈希而不将“-”更改为“”?

让我们在第164行检查一下。Rails将散列键从
-
规范化为

因此,我提出了两种解决方案:

  • 调用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源代码时,我认为它不可能调用XMLConverter的normalize_key方法,该方法将“-”替换为“-”。可能是其他任何人都可以解释一些全局配置,以防止出现这种情况。显然,您可以用一些sentinel值替换“-”,并在转换后将其替换回“-”
    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)