XML 元素中的连字符 (-) 在将其转换为 Ruby 中的 JSON 时变为下划线 (_)

Hyphen (-) in XML element is becoming Underscore (_) when converting it into JSON in Ruby

我的 XML 元素的日期用连字符分隔并以下划线开头,以保持 XML 有效。

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <_2018-12-11>
    <USD>1.1379</USD>
    <JPY>128.75</JPY>
    <BGN>1.9558</BGN>
  </_2018-12-11>
  <_2018-12-10>
    <USD>1.1425</USD>
    <JPY>128.79</JPY>
    <BGN>1.9558</BGN>
  </_2018-12-10>
</root>

我使用 Nokogiri 和 Active Support 将文档转换为 JSON。这是代码:-

require 'json'
require 'nokogiri'
require 'active_support/core_ext/hash/conversions'
s = File.read('../data/currency_source.xml')
x = Nokogiri::XML(s)
newX = Hash.from_xml(x.to_s) #Even though I use Hash.from_xml(x).to_json, it throws an error "does not have a valid root"

puts JSON.pretty_generate(newX)

上面的代码在哈希中打印信息,日期应该是 _2018-12-11 但它显示为 _2018_12_11.

当我只打印 XML 时,它会正确显示日期元素,但在将其转换为 JSON 后显示不正确。

有什么我可以解决的问题来获得正确格式的日期,即用连字符分隔,而不是下划线?

P.S。我也尝试过 Crack 和 CobraVsMongoose。 Crack 也会产生同样不受欢迎的日期格式。但是,CobraVsMongoose 正确地维护了连字符,但不必要地附加了 $ 符号。

这种转换是在 .from_xml 的 ActiveSupport 代码中明确完成的。从 source 开始,转换后的哈希的键被规范化以删除破折号:

def normalize_keys(params)
  case params
  when Hash
    Hash[params.map { |k, v| [k.to_s.tr("-", "_"), normalize_keys(v)] } ]
  when Array
    params.map { |v| normalize_keys(v) }
  else
    params
  end
end

没有评论解释为什么这是必要的或可取的,也没有 option/switch 跳过规范化。一种可能的解决方法是在 XML 源密钥中使用不同的分隔符(例如 _2018.12.10),然后在将它们安全地放入哈希后将它们转换为破折号。