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