使用Nokogiri和Rails 3从API解析XML

时间:2011-01-12 09:32:31

标签: ruby-on-rails-3 nokogiri xml-parsing

您好我正试图用Nokogiri从网站API解析XML。我只是好奇,看看我是否在正确的轨道上。我有一个控制器处理解析,然后我希望模型初始化必要的参数,然后在视图中将其显示为一个简单的列表。我在控制器中想到这样的事情:

def index
doc = Nokogiri::XML(open("http://www.mysomething.com/partner/api/1_0/somerandomkeynumber4b0/channel/11number/material/list/").read) 

@news = [] 

doc.css("news").each do |n|
  header = n.css("header").text
  source_name = n.css("source_name").text  
  summary = n.css("summary").text 
  url = i.css("url").text
  created_at = i.css("created_at").text
  type_of_media = i.css("type_of_media").text

  @news << News.new(
                    :header => header,)
end

然后是模型:

class News
include ActiveModel::Validations

validates_presence_of :url, :type_of_media

attr_accessor :header, :source_name, :summary, :url, :created_at, :type_of_media  

def initialize(attributes = {})
  @header = attributes[:header]
  @source_name = attributes[:source_name]
  @summary = attributes[:summary]
  @url = attributes[:url]
  @created_at = attributes[:created_at]
  @type_of_media = attributes[:type_of_media]
end  

这是你怎么做的?!我不确定我是否正确。也许你有一个关于将Nokogiri与谷歌地图或其他东西等视图结合起来的好方法的任何提示。现在我得到一个错误说
Missing template news/index with {:formats=>[:html], :handlers=>[:builder, :rjs, :erb, :rhtml, :rxml], :locale=>[:en, :en]} in view paths

提前致谢!

@noodle:所以:

  @news = doc.css('query').map do |n|
  h = {}
  %w(header source_name summary url created_at type_of_media).each do |key|
   h[key.to_sym] = n.css(key).text
  end
 News.new(h)
end 

等于:

@news = [] 

doc.css("news").each do |n|
  header = n.css("header").text
  source_name = n.css("source_name").text  
  summary = n.css("summary").text 
  url = i.css("url").text
  created_at = i.css("created_at").text
  type_of_media = i.css("type_of_media").text

  @news << News.new(
                :header => header,)
end

我理解你了吗?!关于我找到问题的模板。这是一个轻微的拼写错误。干杯!

1 个答案:

答案 0 :(得分:0)

你真的在这里问两个问题..

是我的xml - &gt;解析 - &gt;填充管道好吗?

是的,差不多。由于你的.each块中没有条件逻辑,所以这样做会更干净:

@news = doc.css('query').map do |n|
  #...
  News.new(:blah => blah, ...)
end

..但这是一个小问题。

修改

您可以通过从解析的xml初始化哈希值然后将其传递给Model.new来保存一些输入,例如:

@news = doc.css('query').map do |n|
  h = {}
  h[:header] = n.css('header').text
  # ...
  News.new(h)
end

编辑2

甚至更短......

@news = doc.css('query').map do |n|
  h = {}
  %w(header source_name summary url created_at type_of_media).each do |key|
    h[key.to_sym] = n.css(key).text
  end
  News.new(h)
end

事实上#inject可能会让它更短暂,但我认为这有点混淆。

为什么rails无法找到我的视图模板?

Dunno,有吗?你没有给出足够的细节来回答这一部分。