春風博客

          春天里,百花香...

          導航

          <2008年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          用于將對象持久化到XML文件以及讀取,刪除的持久化類(dom4j,xstream實現)

          弄著玩的,不看也罷。

          在此類的幫助下,你不必關注細節就能將對象持久化到XML文件以及讀取,刪除,只有更新麻煩一點,你需要先刪除再添加。

          具體代碼:
          XmlPersistence類:

          package com.sitinspring.persist;

          import java.io.File;
          import java.io.FileWriter;
          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;

          import org.dom4j.Document;
          import org.dom4j.DocumentHelper;
          import org.dom4j.Element;
          import org.dom4j.io.OutputFormat;
          import org.dom4j.io.SAXReader;
          import org.dom4j.io.XMLWriter;

          import com.thoughtworks.xstream.XStream;

          /**
           * 用于將任意對象持久化到XML文件及其逆過程的持久化類(dom4j,xstream實現)
           * 
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-1-8
           
          */

          public class XmlPersistence<T> {
              
          // XML文件名
              private final String xmlFile;

              
          // XML 文檔對象
              private Document document;

              
          // 根節點
              private Element root;

              
          // 根節點名稱
              private final String rootText = "root";

              
          /**
               * 單參數構造函數,指定存儲的文件名
               * 
               * 
          @param xmlFile
               
          */

              
          public XmlPersistence(String xmlFile) {
                  
          this.xmlFile = xmlFile;

                  init();
              }


              
          /**
               * 添加一個對象對應的節點到XML文件
               * 
               * 
          @param type
               
          */

              
          public void add(T type) {
                  
          // 將對象轉化為XML文字
                  XStream xStream = new XStream();
                  String xml 
          = xStream.toXML(type);

                  
          try {
                      
          // 將轉化后的文字變成節點
                      Document docTmp = DocumentHelper.parseText(xml);
                      Element typeElm 
          = docTmp.getRootElement();

                      
          // 添加這個節點
                      root.add(typeElm);

                      
          // 保存文件
                      saveDocumentToFile();
                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                  }

              }


              
          /**
               * 從XML文件中,刪除一個對象對應的節點
               * 
               * 
          @param type
               
          */

              
          public void del(T type) {
                  
          // 將對象轉化為XML文字
                  XStream xStream = new XStream();
                  String xml 
          = xStream.toXML(type);

                  
          try {
                      List nodes 
          = root.elements();

                      
          for (Iterator it = nodes.iterator(); it.hasNext();) {
                          Element companyElm 
          = (Element) it.next();

                          
          // 查找,節點全文相同必定元素相同
                          if (companyElm.asXML().equals(xml)) {
                              
          // 刪除原有節點
                              root.remove(companyElm);

                              
          // 保存文件
                              saveDocumentToFile();
                              
          return;
                          }

                      }

                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                  }

              }


              
          /**
               * 從XML中取得所有對象
               * 
               * 
          @return
               
          */

              
          public List<T> loadAll() {
                  List
          <T> retval = new ArrayList<T>();

                  
          try {
                      List nodes 
          = root.elements();

                      
          for (Iterator it = nodes.iterator(); it.hasNext();) {
                          
          // 取得每個節點
                          Element companyElm = (Element) it.next();
                          
                          
          // 將節點轉化為對象
                          XStream xStream = new XStream();
                          T t 
          = (T) xStream.fromXML(companyElm.asXML());

                          retval.add(t);
                      }

                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                  }


                  
          return retval;
              }


              
          // 初始化文檔對象及根節點
              private void init() {
                  File file 
          = new File(xmlFile);

                  
          try {
                      
          // 判斷文件的存在以增強程序的健壯性
                      if (file.exists()) {
                          
          // 文件存在,直接從文件讀取文檔對象
                          SAXReader reader = new SAXReader();
                          document 
          = reader.read(file);
                          root 
          = document.getRootElement();
                      }
           else {
                          
          // 文件不存在,創建文檔對象
                          document = DocumentHelper.createDocument();
                          root 
          = document.addElement(rootText);// 創建根節點
                      }

                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                  }

              }


              
          /**
               * 將Document寫回文件
               * 
               
          */

              
          private void saveDocumentToFile() {
                  
          try {
                      OutputFormat format 
          = OutputFormat.createPrettyPrint();
                      format.setEncoding(
          "GBK"); // 指定XML編碼
                      XMLWriter writer = new XMLWriter(new FileWriter(xmlFile), format);

                      writer.write(document);
                      writer.close();
                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                  }

              }

          }

          測試類及測試代碼:
          Company類:
          package com.sitinspring.domain;

          import java.util.Hashtable;
          import java.util.Iterator;
          import java.util.Map;

          /**
           * 領域對象-公司類
           * 
           * 
          @author sitinspring
           * 
           * @date 2007-12-30
           
          */

          public class Company {
              
          //     公司名
              private String name;

              
          // 成員哈希表
              private Map<String, Employee> staff;
              
              
          /**
               * 構造函數
               * 
          @param name
               
          */

              
          public Company(String name){
                  
          this.name=name;
              }

              
              
          public String toString(){
                  String retval
          ="公司:名稱="+name;
                  
                  
          if(staff != null){
                      Iterator
          <Employee> iter=staff.values().iterator();
                      retval
          +=" 雇員有:";
                      
                      
          while(iter.hasNext()){
                          Employee tmp
          =iter.next();
                          retval
          +=tmp.getName()+",";                
                      }

                  }

                  
                  
          return retval;
              }


              
          /**
               * 向成員哈希表中添加成員
               * 
               * 
          @param employee
               * 
          @return true:添加成功;false:有同名成員存在,添加失敗
               
          */

              
          public boolean add(Employee employee) {
                  
          if (staff == null{
                      staff 
          = new Hashtable<String, Employee>();
                  }


                  
          if (staff.containsKey(employee.getName())) {
                      
          // 存在同名成員
                      return false;
                  }
           else {
                      
          // 不存在同名成員
                      staff.put(employee.getName(), employee);

                      
          // 給member賦上自己的指針,以便讓成員示例能找到自己所在的公司
                      employee.setCompany(this);

                      
          return true;
                  }

              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }

          }


          測試類Employee:
          package com.sitinspring.domain;

          /**
           * 領域對象-雇員類
           * 
           * 
          @author sitinspring
           * 
           * @date 2007-12-30
           
          */

          public class Employee implements Comparable {

              
          private String name;// 姓名

              
          // 指向包含自己的公司的指針
              private Company company;
              
              
          public Employee(String name){
                  
          this.name=name;
              }


              
          public int compareTo(Object obj) {
                  Employee another 
          = (Employee) obj;

                  
          return this.name.compareTo(another.name);
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public Company getCompany() {
                  
          return company;
              }


              
          public void setCompany(Company company) {
                  
          this.company = company;
              }

          }

          測試代碼:
          1.存儲過程
          // 1.存儲過程
                  Company google=new Company("google");
                  google.add(
          new Employee("Andy"));
                  google.add(
          new Employee("Bill"));
                  
                  Company microsoft
          =new Company("Microsoft");
                  microsoft.add(
          new Employee("Cindy"));
                  microsoft.add(
          new Employee("Douglas"));
                  
                  XmlPersistence
          <Company> persistCmp=new XmlPersistence<Company>("company.xml");
                  persistCmp.add(google);
                  persistCmp.add(microsoft);

          2.讀取過程
                  XmlPersistence<Company> persistCmp=new XmlPersistence<Company>("company.xml");
                  List
          <Company> ls=persistCmp.loadAll();
                  
          for(Company company:ls){
                      System.out.println(company);
                  }

          3.刪除及更新過程
                  // 3.刪除及更新過程
                  Company google=new Company("google");
                  google.add(
          new Employee("Andy"));
                  google.add(
          new Employee("Bill"));
                  
                  Company microsoft
          =new Company("Microsoft");
                  microsoft.add(
          new Employee("Cindy"));
                  microsoft.add(
          new Employee("Douglas"));
                  
                  XmlPersistence
          <Company> persistCmp=new XmlPersistence<Company>("company.xml");
                  persistCmp.add(google);
                  persistCmp.add(microsoft);
                  
                  
          // 刪除一個公司
                  persistCmp.del(microsoft);
                  
                  
          // 更新一個公司(先刪除舊的再添加新的)
                  persistCmp.del(google);        
                  google.setName(
          "谷歌");
                  google.add(
          new Employee("sitinspring"));
                  persistCmp.add(google);
                  
                  List
          <Company> ls=persistCmp.loadAll();
                  
          for(Company company:ls){
                      System.out.println(company);
                  }


          代碼下載(請自行加入dom4j-1.6.1.jar,xpp3_min-1.1.3.4.O.jar,xstream-1.2.2.jar等三個包。):
          http://www.aygfsteel.com/Files/sitinspring/XmlPersistenceXstream20080109012751.rar

          posted on 2008-01-09 01:21 sitinspring 閱讀(2668) 評論(0)  編輯  收藏 所屬分類: Java基礎

          sitinspring(http://www.aygfsteel.com)原創,轉載請注明出處.
          主站蜘蛛池模板: 如皋市| 通许县| 安庆市| 克东县| 荔波县| 平果县| 肇东市| 和政县| 龙岩市| 民勤县| 高青县| 南江县| 革吉县| 离岛区| 鄂托克旗| 禹城市| 定南县| 莱州市| 九台市| 连江县| 克什克腾旗| 洪江市| 高唐县| 阿瓦提县| 喀喇沁旗| 肃北| 五家渠市| 商丘市| 永济市| 高尔夫| 肃南| 肇源县| 民乐县| 娄烦县| 渝中区| 南城县| 毕节市| 正定县| 大丰市| 新乡市| 合阳县|