`

用于将对象持久化到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);
        }
分享到:
评论

相关推荐

    微信开发用到的jar包:json 解析,dom4j-1.6.1.jar,xstream-1.3.1.jar

    DOM4J提供了一种灵活的方式来读取、创建、修改和操作XML文档,比如获取XML节点、遍历XML结构、添加或删除元素等。`dom4j-1.6.1.jar`是DOM4J的一个版本,包含所有必要的类和方法来处理XML任务。 3. XStream: ...

    dom+xstream

    在提供的"dom+xstream"压缩包中,可能包含了这两个库的jar文件,以及示例代码或者测试用例,用于演示如何将DOM4J解析的XML数据通过XStream进行序列化和反序列化。用户解压后可以直接引入到自己的项目中,无需额外...

    java 解析xml所需要的dom4j包

    DOM4J是一个强大的Java库,它提供了丰富的API来处理XML,包括读取、写入、修改以及XPath查询。DOM4J在设计上考虑了灵活性和效率,使得开发者可以更方便地处理XML文档。 DOM(Document Object Model)是一种标准的...

    dmo4j和xstream

    结合这两个库,开发者可以方便地处理XML数据,例如从XML文件中读取数据,用dmo4j解析并操作XML结构,然后用XStream将处理后的数据结构转换回Java对象。反之,也可以将Java对象转换为XML,保存或发送出去。在处理XML...

    dom4j api和jar包

    此外,DOM4J还能与JAXB和XStream等序列化库配合,将Java对象转换为XML或反之,这对于数据交换和持久化非常有用。 总的来说,DOM4J是一个功能丰富的XML处理工具,无论你是新手还是经验丰富的开发者,都可以通过其...

    JAVA对象与XML互转

    在Java编程中,将对象转换为XML以及将XML数据转换回对象是常见的需求,尤其是在处理配置文件、数据交换或持久化存储时。本篇将详细探讨这个主题,讲解如何使用Java进行XML与对象的互转。 一、Java对象转XML 1. **...

    xstream_1.4.3及其依赖包_xstream_1.4.3及其依赖包

    在实际应用中,XStream常用于Web服务、持久化存储、配置文件、日志记录等领域,因为它能方便地将Java对象与XML数据进行互换。例如,在Web服务中,服务器可以接收XML请求,使用XStream将其转换为Java对象进行处理,...

    序列化成xml文件所必须的jar包

    XStream的核心优点在于其易用性和灵活性,无需复杂的配置即可实现对象与XML之间的转换。它还支持自定义转换策略,以适应各种复杂的对象结构。 2. **kxml2-2.3.0.jar** - KXML2是一个轻量级的XML解析器,适用于资源...

    XStream及依赖包

    它提供了序列化和反序列化的基础功能,可以用于将Java对象持久化到XML文件或从XML文件中恢复。 `xpp3_min-1.1.3.4.O.jar`是XPP3(pull解析器)的轻量级版本,XStream依赖这个库来解析和生成XML。XPP3是一种高效的...

    XStream jar包

    在实际应用中,XStream常用于Web服务、数据库持久化、配置文件存储等领域。例如,它可以轻松地将Java对象写入文件或流,然后再读取回来,这对于备份、迁移或者跨进程通信都非常有用。同时,XStream也支持与XML ...

    Java与XML数据绑定

    虽然DOM4J不是专门的数据绑定库,但可以通过其API实现对象和XML之间的映射。DOM4J采用Document Object Model (DOM) API,提供了一种结构化的表示XML文档的方式,使得开发者可以方便地添加、删除或修改XML元素。 **...

    将对象生成xml的jar包,xstream-1.4.2,xmlpull-1.1.3.1,xpp3_min-1.1.4c

    在Java开发中,将对象转换为XML是一种常见的需求,特别是在数据交换、持久化或网络通信中。本主题涉及三个关键库:XStream 1.4.2,XMLPull 1.1.3.1和XPP3_min 1.1.4c,它们在对象到XML转换中扮演着重要角色。 **...

    XStream依赖Jar包

    3. **xstream-1.4.4.jar**:这是XStream的主要库文件,包含了所有必要的类和方法,用于实现Java对象到XML的序列化和反序列化。XStream 1.4.4是该库的一个稳定版本,包含了丰富的特性和修复了许多已知问题。 使用...

    读取xml各种格式工具

    XStream是一个Java库,可以将Java对象序列化为XML,或者将XML反序列化为Java对象,非常适合数据持久化或网络传输: ```java XStream xstream = new XStream(); MyClass obj = new MyClass(); String xml = xstream....

    poi读取Excel2007文件

    7. **xstream-1.2.2.jar**:XStream是一个Java库,可以将Java对象序列化为XML,反之亦然,方便数据持久化和交换。 8. **xml-apis.jar**:XML API集合,包含了各种XML标准的接口定义,如DOM和SAX。 9. **XmlSchema-...

    xstream-1.3.jar xpp3_min-1.1.4c.jar

    1. **简单易用**:通过简单的API,开发者可以快速地实现对象到XML的转换,反之亦然。 2. **自动映射**:默认情况下,XStream会自动将Java类的字段映射到XML元素,无需额外的注解或配置。 3. **类型安全**:XStream...

    weixinCourse资源包

    DOM4J是一个强大的Java XML处理库,它提供了全面的XML处理功能,包括读取、写入、修改和操作XML文档。DOM4J支持SAX和DOM解析,同时也提供了XPath查询,使得开发者能更方便地操作XML数据。 **3. JSON相关库** JSON...

    xml和bean之间的相互转换源码

    在Java开发中,XML(可扩展标记语言)和Bean之间的相互转换是常见的操作,尤其是在处理配置文件、数据持久化或Web服务时。这里的"bean"通常指的是JavaBeans,即符合特定设计模式的Java对象,它们封装了数据并提供了...

    jar大全

    下面将详细讨论`dom4j`、`javamail`、`jdbc`、`jdo`以及`xml`相关的知识点。 1. **dom4j**: - dom4j是一个开放源码的Java文档对象模型库,主要用于处理XML、HTML文档。它提供了一种灵活的API来创建、读取、修改...

    使用XML进行增删改查技术编程Java源代码

    在Java编程中,XML常被用于配置文件、数据交换、持久化存储等场景。本教程将深入探讨如何使用XML进行增删改查的操作,并提供相应的Java源代码示例。 首先,我们需要理解XML的基本结构。XML文档由元素构成,元素通过...

Global site tag (gtag.js) - Google Analytics