我们经常会用到各种配置文件,首选的格式是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
原文链接:https://www.f2er.com/xml/299277.html