春风博客

春天里,百花香...

导航

<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.blogjava.net/Files/sitinspring/XmlPersistenceXstream20080109012751.rar

posted on 2008-01-09 01:21 sitinspring 阅读(2634) 评论(0)  编辑  收藏 所属分类: Java基础


只有注册用户登录后才能发表评论。


网站导航:
 
sitinspring(http://www.blogjava.net)原创,转载请注明出处.