加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Write & Read xml as java class

发布时间:2020-12-16 05:08:58 所属栏目:百科 来源:网络整理
导读:我们经常会用到各种配置文件,首选的格式是xml,那么我们如何方便的把我们的配置对象写成xml并且能够以对象的形式读取呢?这里我找到的一个用XSteam实现的xml读写类,非常简单实用, package com.gxy.weixin.util;import java.io.File;import java.io.FileOutputS

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读