在将 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 将散列键从 -
规范化为 _
所以,我想出了两个解决方案:
调用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可能有内部变化,我们很容易出错
将密钥从 _
转换回 -
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)
这个更好,但是太长了,只是我的想法,欢迎任何评论!
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 将散列键从 -
规范化为 _
所以,我想出了两个解决方案:
调用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可能有内部变化,我们很容易出错
将密钥从
_
转换回-
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)
这个更好,但是太长了,只是我的想法,欢迎任何评论!