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
),然后在将它们安全地放入哈希后将它们转换为破折号。
我的 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
),然后在将它们安全地放入哈希后将它们转换为破折号。