2

我正在使用用于交换 XML 消息的外部 API。所以我用了很多Hash#from_xml

但是,#from_xml如果它们是重复元素,则仅对 Array 中的元素进行编码。这是有道理的,但是当我试图遍历一个只出现一次的可重复元素时它会中断。例如:

<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)

有没有更清洁的方法?

4

3 回答 3

3

只需将其包装在一个数组中并将其展平:

array_of_one_or_many = [my_hash['SKU']].flatten

如果它已经是一个数组,它将打开它并使其成为一个通用数组。适用于两种情况。

于 2013-10-09T16:50:15.120 回答
1

当我过去遇到这种情况时,我使用过

foo = ([] << bar).flatten

bar是对象,foo将是一个平面数组。

于 2013-10-09T18:31:48.243 回答
1

您可以使用Array()

irb(main):012:0> Array(1)
=> [1]
irb(main):013:0> Array([1])
=> [1]
于 2015-08-23T09:13:17.770 回答