XML в хеш-таблицу в Ruby: анализ списка исторических изобретений - PullRequest
1 голос
/ 30 сентября 2010

Я бы хотел добавить следующие данные об исторических изобретениях в удобную структуру данных Ruby:

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

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

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

Чтобы сделать вопрос конкретным (и с очевидными скрытыми мотивами), давайте предположим, что ответом должен быть полный скрипт на Ruby, который бродит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"

Я буду работать над своим собственным ответом и отправлю его тоже, если кто-то не превзойдет меня в этом.Спасибо!

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Оказалось проще, чем я думал с Нокогири:

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"
}
1 голос
/ 30 сентября 2010

Использование 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
...