如何在Ruby中导航XML对象

con*_*t01 0 ruby xml loops

我有一个从Web服务的响应创建的常规xml对象.

我需要从某些特定键中获取一些特定值...例如:

<tag>
 <tag2>
  <tag3>
   <needThisValue>3</needThisValue>
   <tag4>
    <needThisValue2>some text</needThisValue2>
   </tag4>
  </tag3>
 </tag2>
</tag>
Run Code Online (Sandbox Code Playgroud)

我怎样才能<needThisValue><needThisValue2> Ruby的?

the*_*Man 5

我是Nokogiri的忠实粉丝:

xml = <<EOT
<tag>
 <tag2>
  <tag3>
   <needThisValue>3</needThisValue>
   <tag4>
    <needThisValue2>some text</needThisValue2>
   </tag4>
  </tag3>
 </tag2>
</tag>
EOT
Run Code Online (Sandbox Code Playgroud)

这将创建一个用于解析的文档:

require 'nokogiri'
doc = Nokogiri::XML(xml)
Run Code Online (Sandbox Code Playgroud)

使用at找到匹配的存取的第一个节点:

doc.at('needThisValue2').class # => Nokogiri::XML::Element
Run Code Online (Sandbox Code Playgroud)

或者search找到与访问者匹配的所有节点作为NodeSet,其作用类似于Array:

doc.search('needThisValue2').class # => Nokogiri::XML::NodeSet
doc.search('needThisValue2')[0].class # => Nokogiri::XML::Element
Run Code Online (Sandbox Code Playgroud)

这使用CSS访问器来定位每个节点的第一个实例:

doc.at('needThisValue').text # => "3"
doc.at('needThisValue2').text # => "some text"
Run Code Online (Sandbox Code Playgroud)

使用CSS再次使用NodeSet:

doc.search('needThisValue')[0].text # => "3"
doc.search('needThisValue2')[0].text # => "some text"
Run Code Online (Sandbox Code Playgroud)

如果需要,可以使用XPath访问器而不是CSS:

doc.at('//needThisValue').text # => "3"
doc.search('//needThisValue2').first.text # => "some text"
Run Code Online (Sandbox Code Playgroud)

通过去教程获得的JumpStart.它非常强大且易于使用.