2016-03-03 28 views
-1

我卡住了,一直在我的頭上敲這個..我想從這個節點集散列數組。創建從Nokogiri nodeset的哈希陣列與.name作爲鍵和.text作爲值

我從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"} 

我在哪裏誤入歧途?

+0

請閱讀 「[MCVE]」。您的示例nodeset不是來自Nokogiri,因爲它不會輸出像這樣的信息。如果這應該是輸入XML,它是無效的。你寫了什麼代碼來解決這個問題?我們幫助您修復代碼,我們不會爲您編寫代碼,因此請向我們展示證明問題的最低代碼。 –

回答

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 
+0

酷讓我試試..我以爲.map迭代了一個數組,但我想它不.. – ToddT

+0

嗯,我認爲喬是我們迭代的節點集? XML格式並不理想,因爲它具有屬於同一層但在不同XML元素中的信息(SKU /數量)。如果這些屬性是相同元素的話,會更容易。或者這些元素在另一個XML元素內組合在一起。這代表一些購物籃或訂單信息,我猜? –

+0

是的,它的API信息..不是我們將格式化.. – ToddT