如何在Ruby中导航XML对象

时间:2011-07-01 23:34:24

标签: ruby xml loops

我有一个通过Web服务响应创建的常规xml对象。

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

<tag>
 <tag2>
  <tag3>
   <needThisValue>3</needThisValue>
   <tag4>
    <needThisValue2>some text</needThisValue2>
   </tag4>
  </tag3>
 </tag2>
</tag>

如何在Ruby中获取<needThisValue><needThisValue2>

4 个答案:

答案 0 :(得分:5)

我是Nokogiri的忠实粉丝:

xml = <<EOT
<tag>
 <tag2>
  <tag3>
   <needThisValue>3</needThisValue>
   <tag4>
    <needThisValue2>some text</needThisValue2>
   </tag4>
  </tag3>
 </tag2>
</tag>
EOT

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

require 'nokogiri'
doc = Nokogiri::XML(xml)

使用at查找与访问者匹配的第一个节点:

doc.at('needThisValue2').class # => Nokogiri::XML::Element

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

doc.search('needThisValue2').class # => Nokogiri::XML::NodeSet
doc.search('needThisValue2')[0].class # => Nokogiri::XML::Element

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

doc.at('needThisValue').text # => "3"
doc.at('needThisValue2').text # => "some text"

再次使用CSS的NodeSet:

doc.search('needThisValue')[0].text # => "3"
doc.search('needThisValue2')[0].text # => "some text"

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

doc.at('//needThisValue').text # => "3"
doc.search('//needThisValue2').first.text # => "some text"

浏览the tutorials以获得快速启动。它非常强大且易于使用。

答案 1 :(得分:2)

require "rexml/document"
include REXML
doc = Document.new string
puts XPath.first(doc, "//tag/tag2/tag3/needThisValue").text
puts XPath.first(doc, "//tag/tag2/tag3/tag4/needThisValue2").text

答案 2 :(得分:0)

试试this Nokogiri tutorial。 你需要安装nokogiri gem。

祝你好运。

答案 3 :(得分:0)

查看Nokogiri gem。您可以阅读一些教程enter link description here。它快速而简单。