从Nokogiri节点集创建哈希数组,其中.name为Key,。text为值

时间:2016-03-03 18:22:38

标签: ruby xml nokogiri

我被困住了,一直在我的脑袋上敲我的头......我想从这个节点集中得到一系列哈希值。

我从Nokogiri获得了这个节点集。

joe = <sku>4A</sku>
<quantity type="integer">6</quantity>
<sku>5B</sku>
<quantity type="integer">2</quantity>

我想要的是这个:

[{"sku"=> "4A", "quantity"=> 6}, {"sku"=> "5B", "quantity"=> 2}]

我试过了:

Hash[*joe]

但这给了我:

{"<sku>4A</sku>"=> "<quantity type="integer">6</quantity>"}

我试过地图:

Hash[joe.map {|x| [x.name,x.text]}]

这几乎是它,但它在第一个2 ..

之后停止
{"sku"=>"4A", "quantity"=>"6"}

我哪里误入歧途?

1 个答案:

答案 0 :(得分:0)

尝试

key = nil
joe.each_with_object([]) do |child, akku|
  if key.nil?
    key = child.text
  else
    akku << {'sku' => key, 'quantity' => child.text.to_i}
    key = nil
  end
end

或(当然循环比需要的多得多)

values = joe.map(&:text)
skus = values.select.each_with_index { |item, index| index.even? }
quantites = values.select.each_with_index { |item, index| index.odd? }
result = skus.zip(quantites).each_with_object([]) do |(sku, quantity), akku|
  akku << {'sku' => sku, 'quantity' => quantity.to_i}
end