Синтаксический анализ XML из API с помощью Nokogiri и Rails 3 - PullRequest
1 голос
/ 12 января 2011

Привет, я пытаюсь проанализировать XML из API веб-сайтов с Nokogiri. Мне просто интересно посмотреть, нахожусь ли я на правильном пути. У меня есть контроллер, который выполняет синтаксический анализ, и затем я хотел бы, чтобы модель инициализировала необходимые параметры и затем отобразила его в виде простого списка в представлении. Я думал что-то вроде этого в контроллере:

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 с другими вещами для просмотра, такими как карты Google или что-то еще. Прямо сейчас я получаю сообщение об ошибке
Missing template news/index with {:formats=>[:html], :handlers=>[:builder, :rjs, :erb, :rhtml, :rxml], :locale=>[:en, :en]} in view paths

Заранее спасибо!

@ лапша: Так вот:

  @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 голосов
/ 12 января 2011

Вы действительно задаете два вопроса здесь ..

Мой xml -> parse -> заполнить конвейер в порядке?

Да, в значительной степени. Поскольку в вашем .each-блоке нет условной логики, было бы чище сделать это так:

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

.. но это второстепенный вопрос.

EDIT

Вы можете сохранить некоторую типизацию, инициализируя хеш из проанализированного 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 может сделать это еще короче, но я думаю, что это будет немного запутано.

Почему рельсы не могут найти мой шаблон просмотра?

Не знаю, есть ли один? Вы не предоставили достаточно подробностей, чтобы ответить на эту часть.

...