我正在使用外部API与我交换XML消息。所以我使用了很多Hash#from_xml
。
但是,#from_xml
只对数组中的元素进行编码(如果它们是重复元素)。这是有道理的,但当我试图循环只出现一次的可重复元素时,它就会中断。例如:
<Stuff>
<SKU>ABC-123</SKU>
<SKU>DEF-456</SKU>
<SKU>XYZ-789</SKU>
</Stuff>
效果很好,因为:
my_hash = Hash.from_xml(xmlstring)["Stuff"]
将包含3个SKU,所以我可以这样做:
my_hash["Stuff"].each do |sku|
# process the sku
end
但是这个XML失败了:
<Stuff>
<SKU>XYZ-789</SKU>
</Stuff>
因为myhash['SKU']
是哈希,而不是数组。我现在必须这样做:
my_hash['SKU'] = [my_hash['SKU']] if my_hash['SKU'].kind_of?(Hash)
有更清洁的方式吗?
答案 0 :(得分:3)
将它包装在一个数组中并展平它:
array_of_one_or_many = [my_hash['SKU']].flatten
如果它已经是一个数组,它将打开它并使它成为一个普通的数组。适用于这两种情况。
答案 1 :(得分:1)
过去我遇到这个时,我已经使用了
foo = ([] << bar).flatten
bar
是对象,foo
将是一个平面数组。
答案 2 :(得分:1)
您可以使用Array()
irb(main):012:0> Array(1)
=> [1]
irb(main):013:0> Array([1])
=> [1]