如何使用Ruby轻松解析XML以查询和查找某些标记值?

时间:2010-09-02 04:57:03

标签: ruby xml parsing

我正在使用API​​,想知道如何根据标签轻松搜索和显示/格式化输出。

例如,以下是包含API的页面和XML OUtput的示例:

http://developer.linkedin.com/docs/DOC-1191

我希望能够将每条记录视为一个对象,例如User.first-name User.last-name,以便我可以显示和存储信息,并进行搜索。

是否有宝石可以让这更容易?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<people-search>
  <people total="108" count="10" start="0">
    <person>
      <id>tePXJ3SX1o</id>
      <first-name>Bill</first-name>
      <last-name>Doe</last-name>
      <headline>Marketing Professional and Matchmaker</headline>
      <picture-url>http://media.linkedin.com:/....</picture-url>
    </person>
    <person>
      <id>pcfBxmL_Vv</id>
      <first-name>Ed</first-name>
      <last-name>Harris</last-name>
      <headline>Chief Executive Officer</headline>
    </person>
     ...
  </people>
  <num-results>108</num-results>
</people-search>

4 个答案:

答案 0 :(得分:4)

这可能会给你一个快速启动:

#!/usr/bin/env ruby

require 'nokogiri'

XML = %{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<people-search>
  <people total="108" count="10" start="0">
    <person>
      <id>tePXJ3SX1o</id>
      <first-name>Bill</first-name>
      <last-name>Doe</last-name>
      <headline>Marketing Professional and Matchmaker</headline>
      <picture-url>http://media.linkedin.com:/foo.png</picture-url>
    </person>
    <person>
      <id>pcfBxmL_Vv</id>
      <first-name>Ed</first-name>
      <last-name>Harris</last-name>
      <headline>Chief Executive Officer</headline>
    </person>
  </people>
  <num-results>108</num-results>
</people-search>}

doc = Nokogiri::XML(XML)

doc.search('//person').each do |person|
    firstname   = person.at('first-name').text
    puts "firstname: #{firstname}"
end
# >> firstname: Bill
# >> firstname: Ed

这个想法是你在这个案例中循环重复的部分“人”。然后,您选择所需的部分并提取文本。我正在使用Nokogiri的.at()来获得第一次出现,但还有其他方法可以做到。

Nokogiri网站有很好的例子和精心编写的文档,所以一定要花些时间来讨论它。你会发现它很容易。

答案 1 :(得分:1)

nokogiri是一个非常好的ruby xml解析器,它允许你使用xpath或css3选择器来访问你的xml,但它不是xml到对象映射器

有一个名为xml-mapping的项目通过定义应映射到对象属性的xpath表达式来完成此操作 - 反之亦然。

答案 2 :(得分:1)

This is how我使用内置的REXML为Ruby Challenge做过。

这基本上是整个文档的解析代码:

doc = REXML::Document.new File.new cia_file
doc.elements.each('cia/continent') { |e| @continents.push Continent.new(e) }
doc.elements.each('cia/country') { |e| @countries.push Country.new(self, e) }

答案 3 :(得分:0)

http://nokogiri.org/是您应该调查的选项