弄著玩的,不看也罷。
在此類的幫助下,你不必關注細節就能將對象持久化到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://m.tkk7.com/Files/sitinspring/XmlPersistenceXstream20080109012751.rar