Write & Read xml as java class

我们经常会用到各种配置文件,首选的格式是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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇