0

鉴于我有以下代码:

  ENDPOINT = 'http://api.eventful.com'
  API_KEY  = 'PbFVZfjTXJQWrnJp'

  def get_xml(url, options={})
    compiled_url = "#{ENDPOINT}/rest#{url}" << "?app_key=#{API_KEY}&sort_order=popularity"
    options.each { |k, v| compiled_url << "&#{k.to_s}=#{v.to_s}" }
    REXML::Document.new((Net::HTTP.get(URI.parse(URI.escape(compiled_url)))))
  end

  def event_search(location, date)
    get_xml('/events/search', 
      :location => "#{location}, United Kingdom",
      :date     => date
    )
  end

我们访问格式REXML::Document如下的 XML 数据:

events = event_search('London', 'Today').elements

我们可以像这样访问这些元素(这会打印事件中的所有标题):

events.each('search/events/event/title') do |title|
  puts title.text
end

我正在使用的 XML 可以在这里找到。我希望这个构造一个像这样的哈希:

{"Title1" => {:title => 'Title1', :date => 'Date1', :post_code => 'PostCode1'}, 
"Title2" => {:title => 'Title2', :date => 'Date2', :post_code => 'PostCode2'}}

使用events.each('search/events/event/title')events.each('search/events/event/date')和时events.each('search/events/event/post_code')

所以我想从上面包含的 URL 提供的 XML 中创建一个 Hash。谢谢!

4

2 回答 2

0

使用 REXML:Document 对象上的 root() 获取根元素,然后使用 each_element("search/events/event") 迭代“事件”节点。然后,您可以使用元素上的不同方法从中提取不同的值:http ://ruby-doc.org/stdlib-1.9.3/libdoc/rexml/rdoc/REXML/Element.html

于 2013-08-06T15:22:29.393 回答
0

您应该遍历事件本身,而不是标题。像这样的东西

events_by_title = {}
elements.each('search/events/event') do |event|
  title = event.get_elements('title').first.text
  events_by_title[title] = {
    :title => title,
    :date => event.get_elements('start_time').first.text
    :post_code => event.get_elements('postal_code').first.text,
  }
end
于 2013-08-06T15:24:08.883 回答