安装XML Builder
gem install builder
class CatalogController < ApplicationController def gen_xml @xml = Builder::XmlMarkup.new @catalogs=Catalog.find(:all) end end
在目录:views/catalog下新建一个gen_xml.rxml文件
@xml.instruct! :xml, :version=>"1.0" @xml.catalogs{ for catalog in @catalogs @xml.catalog do @xml.journal(catalog.journal) @xml.publisher(catalog.publisher) @xml.edition(catalog.edition) @xml.title(catalog.title) @xml.author(catalog.author) end end }
def self.import_from_xml(file) file_path = "#{RAILS_ROOT}/tmp/xml/" #创建文件夹 if !File.exist?(file_path) Dir.mkdir(file_path, 0777) end #临时文件命名,不能有非法字符,比如"()"因为在linux下文件名不支持"()"等特殊符号 file_name = "temp.xml" begin data_utf = file.read File.open(file_path + file_name , 'wb') do |f| f.write(data_utf) f.close end ensure file.close end messages = [] doc = REXML::Document.new(data_utf) # 生成一个XML操作对象 doc.root.each_element("//blog") do |n| if check_id?(n.elements["id"].text) # 判断id号是否在数据库中存在,若存在则更新,若不存在则新建 myblog = Myblog.find(n.elements["id"].text) else myblog = Myblog.new end myblog.title = n.elements["title"].text myblog.content = n.elements["content"].text myblog.user_id = n.elements["userid"].text myblog.created_at = n.elements["created"].text myblog.updated_at = n.elements["updated"].text myblog.deleted_at = n.elements["deleted"].text if !myblog.save messages << "#{myblog.errors.full_messages}" end end FileUtils.rm_rf(file_path) if File.exists?(file_path) return messages end
doc.root是根节点,doc.root.each_element("//blog")找出所有blog元素。 n.elements["id"].text取出该blog元素的id子元素。另外还有一些方法比较有用,has_attributes?元素是否有属性,has_elements?是否有子元素,attributes[""]取属性值,parent父元素等等。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13414.html