弄着玩的,不看也罢。
在此类的帮助下,你不必关注细节就能将对象持久化到XML文件以及读取,删除,只有更新麻烦一点,你需要先删除再添加。
具体代码:
XmlPersistence类:
package com.sitinspring.persist;
import java.io.File;
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;
/** *//**
* 用于将任意对象持久化到XML文件及其逆过程的持久化类(dom4j,xstream实现)
*
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-8
*/
public class XmlPersistence<T> {
// XML文件名
private final String xmlFile;
// XML 文档对象
private Document document;
// 根节点
private Element root;
// 根节点名称
private final String rootText = "root";
/** *//**
* 单参数构造函数,指定存储的文件名
*
* @param xmlFile
*/
public XmlPersistence(String xmlFile) {
this.xmlFile = xmlFile;
init();
}
/** *//**
* 添加一个对象對應的節點到XML文件
*
* @param type
*/
public void add(T type) {
// 将对象转化为XML文字
XStream xStream = new XStream();
String xml = xStream.toXML(type);
try {
// 将转化后的文字变成节点
Document docTmp = DocumentHelper.parseText(xml);
Element typeElm = docTmp.getRootElement();
// 添加这个节点
root.add(typeElm);
// 保存文件
saveDocumentToFile();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/** *//**
* 从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 companyElm = (Element) it.next();
// 查找,节点全文相同必定元素相同
if (companyElm.asXML().equals(xml)) {
// 删除原有节点
root.remove(companyElm);
// 保存文件
saveDocumentToFile();
return;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
/** *//**
* 从XML中取得所有对象
*
* @return
*/
public List<T> loadAll() {
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();
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 {
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();
}
}
}
测试类及测试代码:
Company类:
package com.sitinspring.domain;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
/** *//**
* 领域对象-公司类
*
* @author sitinspring
*
* @date 2007-12-30
*/
public class Company {
// 公司名
private String name;
// 成员哈希表
private Map<String, Employee> staff;
/** *//**
* 构造函数
* @param name
*/
public Company(String name){
this.name=name;
}
public String toString(){
String retval="公司:名称="+name;
if(staff != null){
Iterator<Employee> iter=staff.values().iterator();
retval+=" 雇员有:";
while(iter.hasNext()){
Employee tmp=iter.next();
retval+=tmp.getName()+",";
}
}
return retval;
}
/** *//**
* 向成员哈希表中添加成员
*
* @param employee
* @return true:添加成功;false:有同名成员存在,添加失败
*/
public boolean add(Employee employee) {
if (staff == null) {
staff = new Hashtable<String, Employee>();
}
if (staff.containsKey(employee.getName())) {
// 存在同名成员
return false;
} else {
// 不存在同名成员
staff.put(employee.getName(), employee);
// 给member赋上自己的指针,以便让成员示例能找到自己所在的公司
employee.setCompany(this);
return true;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类Employee:
package com.sitinspring.domain;
/** *//**
* 领域对象-雇员类
*
* @author sitinspring
*
* @date 2007-12-30
*/
public class Employee implements Comparable {
private String name;// 姓名
// 指向包含自己的公司的指针
private Company company;
public Employee(String name){
this.name=name;
}
public int compareTo(Object obj) {
Employee another = (Employee) obj;
return this.name.compareTo(another.name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
测试代码:
1.存储过程
// 1.存储过程
Company google=new Company("google");
google.add(new Employee("Andy"));
google.add(new Employee("Bill"));
Company microsoft=new Company("Microsoft");
microsoft.add(new Employee("Cindy"));
microsoft.add(new Employee("Douglas"));
XmlPersistence<Company> persistCmp=new XmlPersistence<Company>("company.xml");
persistCmp.add(google);
persistCmp.add(microsoft);
2.读取过程
XmlPersistence<Company> persistCmp=new XmlPersistence<Company>("company.xml");
List<Company> ls=persistCmp.loadAll();
for(Company company:ls){
System.out.println(company);
}
3.删除及更新过程
// 3.删除及更新过程
Company google=new Company("google");
google.add(new Employee("Andy"));
google.add(new Employee("Bill"));
Company microsoft=new Company("Microsoft");
microsoft.add(new Employee("Cindy"));
microsoft.add(new Employee("Douglas"));
XmlPersistence<Company> persistCmp=new XmlPersistence<Company>("company.xml");
persistCmp.add(google);
persistCmp.add(microsoft);
// 删除一个公司
persistCmp.del(microsoft);
// 更新一个公司(先删除旧的再添加新的)
persistCmp.del(google);
google.setName("谷歌");
google.add(new Employee("sitinspring"));
persistCmp.add(google);
List<Company> ls=persistCmp.loadAll();
for(Company company:ls){
System.out.println(company);
}
分享到:
相关推荐
基于XStream,DOM4J实现xml多种工具类,项目中jar包已齐全 可直接运行。希望对大家有所帮助
dom4j用于解析xml 文档,而XStream则是将Java对象转成xml文件。使用这两个工具就很好的解决了xml文件的解析与Java对象转成xml的麻烦了!
解压后有一个文件夹(包含了dom4j和XStream的简单示例),一个dom4j.jar(用dom4j只需要把这个添加到项目里面),一个xstream-1.4.8的jar包、源码、说明文档.zip(用xstream就解压这个包然后放到项目里面)
利用XStream读写xml文件
xstream、dom4j、groovy、jdom解析xml,所给的xml的例子比较全吧,基本搞懂了这些,这四种解析就差不多了
XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。 和其他序列化工具相比,XStream 有三个突出的特点: XStream 不关心序列化/逆序列化的类的字段的...
使用dom4j高效率xml解析,内涵demo程序,idea导入即可运行,适用于各种复杂xml的解析,给自己留作备份,有需要可下载。
xstream轻松解析xml到java对象,内附样例。so easy!妈妈再也不用担心我的xml解析。
java转换XML的必须要的包,总共三个,分别包括XStream.jar,dom4j.jar和xpull/xpp.jar包。
xstream方式解析及生成xml文件
压缩包里面有两个文件:SAX.java和SAXparse.java 用来解析大于100M的xml文件,SAX读取xml不同于DOM方式,DOM方式在解析xml前需要全部加载xml文件,当xml文件很大时,就会出现内存不足的问题,而SAX则是逐行读取xml...
XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。 在缺省情况下,XStream不需要配置映射关系,对象和字段将映射为同名XML元素。但是当对象和字段名与XML中的元素名不同时,...
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...
dom4j解析XML的两个JAR包,分别是dom4j-1.6.1.jar、jaxen-1.1.1.jar
dom+xstream, dom4j解析xml,没有多余的东西,解压即用,两个版本是ok的, dom4j是1.6.1,xstream是1.3.1
微信开发用到的jar包:json 解析(json-lib-2.4-jdk15.jar),dom4j-1.6.1.jar,xstream-1.3.1.jar
由于先前有已经有上传过dom4j和xtream的两个jar包了,但最近看到之前那个下载积分变成27了,这可能是csdn的bug,我原先都是定义1个积分,因为csdn现在没有0积分了,最低就是1积分!
使用xstream进行java类与xml文件互转解析
将对象(java bean)转换为xml字符串
xstream 将xml文档转换成 java对象,然后就可以利用json库转成json对象啦。