现在有一个MemberPersistence类,负责将MemberInfo类实例存到XML文件及从XML文件中取出,注意看设值取值的过程:
package com.sitinspring;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
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;
/**
* 用于将MemberInfo类实例存到XML文件及从XML文件中取出
*
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-3
*/
public class MemberPersistence {
// XML 文件名
private final String xmlFile;
// XML 文档对象
private Document document;
// XML 文档根节点
private Element root;
/**
* 构造函数,其中实例化文档对象和根节点
* @param xmlFile
*/
public MemberPersistence(String xmlFile) {
this.xmlFile = xmlFile;
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("companies");// 创建根节点
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 从XML文件中提取所有Member节点的信息,作为链表返回
*
* @return
*/
public List<MemberInfo> loadFromXml() {
List<MemberInfo> retval = new ArrayList<MemberInfo>();
try {
List nodes = root.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element memberElm = (Element) it.next();
MemberInfo member = new MemberInfo();
// 取得MemberInfo类的所有定义的成员变量,注意DeclaredFields不包括继承下来的成员变量
Field[] fields = member.getClass().getDeclaredFields();
// 设置每个成员变量的值
for (Field field : fields) {
String fieldText = memberElm.elementText(field.getName());
// 必须设置为true才可以取得成员变量的值,否则field.set(member, fieldText)
// 一句要抛出java.lang.IllegalAccessException异常
field.setAccessible(true);
field.set(member, fieldText);
}
retval.add(member);
}
return retval;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 将一个Member对象写到XML文件中
*
* @param member
*/
public void writeToXml(MemberInfo member) {
try {
// 在根节点下增加一个member节点
Element memberElm = root.addElement("member");
// 取得MemberInfo类的所有定义的成员变量,注意DeclaredFields不包括继承下来的成员变量
Field[] fields = member.getClass().getDeclaredFields();
// 取得每个成员变量的值
for (Field field : fields) {
// 在member节点下添加属性节点
Element fieldElm = memberElm.addElement(field.getName());
// 必须设置为true才可以取得成员变量的值,否则field.get(member)
// 一句要抛出java.lang.IllegalAccessException异常
field.setAccessible(true);
fieldElm.setText((String) field.get(member));
}
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();
}
}
}
最后测试代码:
package com.sitinspring;
import java.util.List;
public class Main{
public static void main(String[] args){
MemberPersistence persistence=new MemberPersistence("member.xml");
// 1.写入过程
MemberInfo andy=new MemberInfo("andy","SSE","Street A No 123");
MemberInfo bill=new MemberInfo("Bill","PM","Street B No 456");
persistence.writeToXml(andy);
persistence.writeToXml(bill);
// 2.读出过程
List<MemberInfo> members=persistence.loadFromXml();
for(MemberInfo member:members){
System.out.println(member);
}
}
}生成和读出的XML文件如下:
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><?xml version="1.0" encoding="GBK"?>
<companies>
<member>
<name>andy</name>
<title>SSE</title>
<address>Street A No 123</address>
</member>
<member>
<name>Bill</name>
<title>PM</title>
<address>Street B No 456</address>
</member>
</companies>
看,结果是我们想要的,设值取值也变得轻巧起来,比原先一个萝卜一个坑的方式要好多了.