在Nokogiri中找到嵌套密钥

时间:2013-11-04 17:34:09

标签: ruby-on-rails ruby nokogiri

我正在使用nokogiri获得以下节点:

  <Instrument id="161" code="648">
    <Parameter key="currency" value="USD"/>
    <Parameter key="calendar" value="JAN"/>
  </Instrument>

这是Nokogiri::XML::NodeSet < Object

我想获得值"USD"

我试过了: node.search 'Parameter[key=currency]'但我不知道如何检索实际值。

那么,我怎样才能获得“USD”的价值?

感谢。

2 个答案:

答案 0 :(得分:5)

由于指向节点很简单,所以你想要的并不完全清楚:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<xml>
  <Instrument id="161" code="648">
    <Parameter key="currency" value="USD"/>
    <Parameter key="calendar" value="JAN"/>
  </Instrument>
</xml>
EOT

doc.at('Parameter')['value'] # => "USD"
doc.search('Parameter').first['value'] # => "USD"

at找到第一个匹配的节点,因此['value']会检索该节点的value内容。

search找到所有匹配的节点,first检索检索到的第一个节点,这是at所做的。

答案 1 :(得分:3)

这是一种方式:

require 'nokogiri'

doc = Nokogiri::XML::Document.parse <<-eot
<Instrument id="161" code="648">
    <Parameter key="currency" value="USD"/>
    <Parameter key="calendar" value="JAN"/>
  </Instrument>
  eot
doc.css('#161 Parameter').map{|e| e['value']}
# => ["USD", "JAN"]
# to get only 'USD' the below would work as per your example.
doc.at_css("#161 Parameter[key='currency']")['value']
# => "USD"

doc.css将为您提供Nokogiri::XML::NodeSetdoc.at_css将为您提供Nokogiri::XML::Nodedoc.css('#161 Parameter')将为您提供所有Parameter个节点,其中如doc.at_css("#161 Parameter[key='currency']"),将为您提供第一个Parameter节点。

  

我试过:node.search'参数[key = currency]'但我不知道如何检索实际值。

你非常接近。只是做

doc.search("Parameter[key='currency']").first['value']
# => "USD"