您的位置:首页 > 编程语言 > Java开发

Write & Read xml as java class

2014-01-11 15:39 260 查看
我们经常会用到各种配置文件,首选的格式是xml,那么我们如何方便的把我们的配置对象写成xml并且能够以对象的形式读取呢?这里我找到的一个用XSteam实现的xml读写类,非常简单实用,

package com.gxy.weixin.util;

import java.io.File;
import java.io.FileOutputStream;
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;
import com.thoughtworks.xstream.io.xml.DomDriver;

/** */
/**
* 用于将任意对象持久化到XML文件及其逆过程的持久化类(dom4j,xstream实现)
*
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-8
*/
public class XmlWriter<T> {
// XML文件名
private final String xmlFile;
// XML 文档对象
private Document document;
// 根节点
private Element root;
// 根节点名称
private final String rootText = "root";

/** */
/**
* 单参数构造函数,指定存储的文件名
*
* @param xmlFile
*/
public XmlWriter(String xmlFile) {
this.xmlFile = xmlFile;
File file = new File(xmlFile);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
init();
}

public void add(T type) {
// 将对象转化为XML文字
XStream xStream = new XStream();
String xml = xStream.toXML(type);
// xml = tryXML(xml);
try {
// 将转化后的文字变成节点
Document docTmp = DocumentHelper.parseText(xml);
Element typeElm = docTmp.getRootElement();
// 添加这个节点
root.add(typeElm);
// 保存文件
saveDocumentToFile();
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void addList(List<T> list) {
// 将对象转化为XML文字
XStream xStream = new XStream();
for (T t : list) {
String xml = xStream.toXML(t);
// xml = tryXML(xml);
try {
// 将转化后的文字变成节点
Document docTmp = DocumentHelper.parseText(xml);
Element typeElm = docTmp.getRootElement();
// 添加这个节点
root.add(typeElm);
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 保存文件
saveDocumentToFile();
}

/** */
/**
* 从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 element = (Element) it.next();
// 查找,节点全文相同必定元素相同
if (element.asXML().equals(xml)) {
// 删除原有节点
root.remove(element);
// 保存文件
saveDocumentToFile();
return;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void deleteAll() {
// 将对象转化为XML文字
XStream xs = new XStream(new DomDriver());
try {
List nodes = root.elements();
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element element = (Element) it.next();
root.remove(element);
// 保存文件
saveDocumentToFile();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/** */
/**
* 从XML中取得所有对象
*
* @return
*/
public List<T> findAll() {
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(new DomDriver());
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 {
File f = new File(xmlFile);
if (f.exists()) {
f.delete();
} else {
f.createNewFile();
}
try {
FileOutputStream fs = new FileOutputStream(f);
fs.write(new byte[0]);
fs.close();
} catch (Exception e) {
// TODO: handle exception
}
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8"); // 指定XML编码
XMLWriter writer = new XMLWriter(new FileWriter(f), format);
writer.write(document);
writer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}


原文地址:
http://xoknight.net/?cat=58
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐