安装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父元素等等。