Ruby中XML到哈希表:解析历史发明列表

Ruby中XML到哈希表:解析历史发明列表,ruby,xml,nokogiri,hpricot,Ruby,Xml,Nokogiri,Hpricot,我想将以下关于历史发明的数据转换成方便的Ruby数据结构: 请注意,所有数据都在XML属性中 似乎应该有一个快速的解决方案,只需几行代码。 有了Rails,就有了Hash.from_xml,尽管我不确定它是否能正确处理属性。 在任何情况下,我都需要它作为一个独立的Ruby脚本。 基于有人针对类似问题发布的代码,此简单任务似乎过于复杂:。 我发现了一个据称是的,但它似乎不能处理XML属性。 也许这是一个简单的扩展? 最后还有一个,但它看起来比nokogiri更重 为了使这个问题具体化(并且有明显

我想将以下关于历史发明的数据转换成方便的Ruby数据结构:

请注意,所有数据都在XML属性中

似乎应该有一个快速的解决方案,只需几行代码。 有了Rails,就有了Hash.from_xml,尽管我不确定它是否能正确处理属性。 在任何情况下,我都需要它作为一个独立的Ruby脚本。 基于有人针对类似问题发布的代码,此简单任务似乎过于复杂:。 我发现了一个据称是的,但它似乎不能处理XML属性。 也许这是一个简单的扩展? 最后还有一个,但它看起来比nokogiri更重

为了使这个问题具体化(并且有明显的不可告人的动机),让我们假设一个答案应该是一个完整的Ruby脚本,它从上面的URL中提取XML,并像这样输出CSV:

id, invention, year, inventor, country
RslCn, "aerosol can", 1926, "Erik Rotheim", "Norway"
RCndtnng, "air conditioning", 1902, "Willis Haviland Carrier", "US"
RbgTmtv, "airbag, automotive", 1952, "John Hetrick", "US"
RplnNgnpwrd, "airplane, engine-powered", 1903, "Wilbur and Orville Wright", "US"

除非有人用明显优于我的东西击败我,否则我会自己写答案,然后把它贴出来。谢谢

使用REXML和open uri:

require "rexml/document"
require "open-uri"

doc = REXML::Document.new open( "http://yootles.com/outbox/inventions.xml" ).read

puts [ 'id', 'invention', 'year', 'inventor', 'country' ].join ','
doc.root.elements.each do |invention|
  inventor = invention.elements.first
  data = []
  data << invention.attributes['id']
  data << '"' + invention.attributes['name'] + '"'
  data << invention.attributes['year']
  data << '"' + inventor.attributes['name'] + '"'
  data << '"' + inventor.attributes['country'] + '"'
  puts data.join ','
end
需要“rexml/document”
需要“打开uri”
doc=REXML::Document.new打开(“http://yootles.com/outbox/inventions.xml)读
放入['id'、'发明'、'年份'、'发明人'、'国家].加入','
doc.root.elements.each do|发明|
inventor=发明。元素。优先
数据=[]

数据结果比我想象中的Nokogiri更简单:

require 'rubygems'
require 'nokogiri' # needs sudo port install libxslt and stuff; see nokogiri.org
require 'open-uri'

@url = 'http://yootles.com/outbox/inventions.xml'

doc = Nokogiri::XML(open(@url))
puts("id, invention, year, inventor, country")
doc.xpath("//invention").each{ |i| 
  inventor = i.xpath("inventor").first
  print i['id'], ", \"", i['name'], "\", ", i['year'], ", \"", 
  inventor['name'], "\", \"", inventor['country'], "\"\n"
}