XML文件

安装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父元素等等。
posted @ 2012-12-03 13:53  残星  阅读(215)  评论(0编辑  收藏  举报