Rails 3.0解析XML并插入数据库

时间:2011-09-08 08:56:48

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

我是Rails的新手,我正在尝试将我的应用程序连接到第三方API(它没有Rails的gem或插件)。

理想情况下,我想要做的就是解析数据(我听说过关于Nokogiri的好东西,但不知道如何将它用于我想要做的事情。不是因为没有尝试) ,然后将其插入数据库。

有人可以提供指示或指出我正确的方向吗? 欢呼声。

更新

佣金任务:

task :fetch_flyers => :environment do

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::XML(open(url))

  events = doc.search('//event')

    events.each do |event|
      @data = Event.new(
        :name           => event.at('name').text,
        :date           => '2011-09-18',
        :time           => '17:00',
        :description    => event.at('long_description').text,
        :address        => event.at('street').text,
        :postcode       => event.at('postcode').text,   
        :price          => event.at('costs').text,
        :user_id        => 1,
        :genre_id       => 1,   
        :town_id        => 1)

    @data.save

    if @data.save
        puts "Success"
    else
        puts "This didn't save, F***"
    end
    end
end

我在代码中指定了URL,只是将其隐藏在此代码粘贴中。 此代码不起作用。我不能为我的生活找出原因。我得到的只是终端输出说“这没有保存,F * * 这意味着由于某种原因事件没有被保存。任何人都可以放弃一些点亮这个?

更新2:

我检查过网址是否正确,并检查了XML是否正确使用以下方法解析:

# Printing Out the Variables to make sure they work.
    puts @name
    puts @date
    puts @time
    puts @desc
    puts @address
    puts @postcode
    puts @price
    puts @user
    puts @genre
    puts @town

..哪个成功打印出终端中的值。但是,它仍然不会插入我的数据库。

我的模型如下:

belongs_to :user
    belongs_to :genre
    belongs_to :town

    has_attached_file :image, :styles => { :grid => '90x128#', :list => '140x200#', :full => '400x548'}
    validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/png']  
    before_post_process :normalise_file_name

  validates :name, :presence => true
  validates :date, :presence => true
  validates :time, :presence => true
  validates :description, :presence => true
  validates :address, :presence => true
  validates :town, :presence => true
  validates :postcode, :presence => true
  validates :price, :presence => true
  validates :user_id, :presence => true
  validates :viewcount, :presence => true

我的Development.log文件只显示了一个加载:

  [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
      [1m[36mTown Load (0.1ms)[0m  [1mSELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1[0m
      [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
      [1m[36mTown Load (0.1ms)[0m  [1mSELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1[0m
      [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
      [1m[36mTown Load (0.1ms)[0m  [1mSELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1[0m
      [1m[35mTown Load (0.1ms)[0m  SELECT "towns".* FROM "towns" WHERE "towns"."id" = 1 LIMIT 1
    .......

每次我尝试运行rake任务。这有什么意义吗?

3 个答案:

答案 0 :(得分:3)

使用nokogiri时,您可以指定css或xpath选择器,例如:

doc = Nokogiri::XML(xml_string)
events = doc.search('//event')
events.each do |event|
  puts event.at('short_description')
end

另外,请查看nokogiri intro tutorials

答案 1 :(得分:0)

在定义events之后,我在获取URL后放置了一个放置,以查看是否在第一个实例中返回了任何数据。然后我检查事件模型以查看是否有任何未经验证的验证 - 模型是否需要唯一的user_id或其他东西。我还将数据作为非实例变量,以查看是否有所不同。我会检查那些时间格式是不是在模型中引起错误。

答案 2 :(得分:0)

我只是看到你的日志,发现你的事件模型确实具有Town Model的has_many实现,并且还包含事件表中的town_id列。 所以我认为这可能是问题,因为它试图获取town_id并在事件表中保存城镇的外键。但由于它没有得到任何所以它总是回滚。 如果你想,那么尝试**

  

@ data.save!

安装

  

@ data.save

感谢