2017-08-07 50 views
0

我有这样将引入nokogiri XML节点到红宝石哈希

<parentNode> 

    <amount>12.0</amount><authIdCode>999999</ authIdCode><currency>USD</currency> 

</ parentNode> 

一个xml我怎样才能得到ParentNode内的所有节点的哈希类似下面?

{amount: "12", authIdCode: "999999", currency: "USD"} 

是的我可以使用nokogiri搜索个人密钥。但是是否有可能获得ParentNode dynamically中的所有键和值并将其变为散列?

谢谢。

注:Hash.from_xml不会工作的我不使用轨道

回答

2

这里是工作示例:

require 'nokogiri' 

xml = <<-EOS 
<parentNode> 
    <amount>12.0</amount> 
    <authIdCode>999999</authIdCode> 
    <currency>USD</currency> 
</ parentNode> 
EOS 
document = Nokogiri::XML(xml) 

hash = document.xpath("//parentNode/*").each_with_object({}) do |node, hash| 
    hash[node.name] = node.text 
end 

p hash # => {"amount"=>"12.0", "authIdCode"=>"999999", "currency"=>"USD"} 

它发现的parentNode所有的孩子们,用孩子的名字键,其文本内容为值。

+0

的伟大工程..感谢很多队友.. – Abhilash

+0

我知道这个回答我的问题以及..但如果没有办法让这样的哈希值。 '{“parentNode”=> {“amount”=>“12.0”,“authIdCode”=>“999999”,“currency”=>“USD”}}'...因此,无论parentNode名称如何,总会有一个父节点。所以不需要数组。但是在某些情况下,父节点名称可能会更改。 – Abhilash

+1

总是只有一个父节点有子节点?你确定?这意味着你的根元素是父节点。如果是这样,你可以使用'/ */*'作为你的XPath。 –

2

使用Hash[]

Hash[doc.search('parentNode/*').map{|n| [n.name, n.text]}] 
#=> {"amount"=>"12.0", "authIdCode"=>"999999", "currency"=>"USD"}