2010-09-30 2 views
1

я хотел бы хлебать следующие данные об исторических изобретений в удобную структуру данных Ruby:XML в хэш-таблицу в Ruby: PARSING список исторических изобретений

http://yootles.com/outbox/inventions.xml

Заметим, что все данные в атрибуты XML.

Кажется, что должно быть быстрое решение с несколькими строками кода. С Rails должен быть Hash.from_xml, хотя я не уверен, что правильно обработал бы атрибуты. В любом случае, мне нужно это как отдельный скрипт Ruby. Nokogiri кажется слишком сложным для этой простой задачи, основанной на этом коде, который кто-то опубликовал для аналогичной проблемы: http://gist.github.com/335286. Я нашел якобы simple solution using hpricot, но он, похоже, не обрабатывает атрибуты XML. Возможно, это простое расширение? Наконец-то есть ROXML, но это выглядит еще тяжелее, чем nokogiri.

Для того, чтобы вопрос бетон (и с очевидными скрытыми мотивами), скажем, что ответ должен быть полный рубин скрипт, который хлебает в XML из приведенного выше URL и выплевывает 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" 

Я буду работать над своим собственным ответом и опубликовать его, если кто-то не ударит меня в удар с чем-то явно превосходящим. Благодаря!

ответ

1

Использование REXML и открытым 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 
1

Это оказалось проще, чем я думал, что с 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" 
} 
+0

+1 для Nokogiri –