利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合 - s9797456/MyCommonCodeSnippets GitHub Wiki
package com.xinle.car.admin.common.util;
import java.io.File; import java.io.FileWriter; import java.lang.reflect.Field; import java.lang.reflect.Method; 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;
/**
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- @author lenovo
/ public class Dom4jXmlUtil { /* * DMO4J写入XML * * @param obj * 泛型对象 * @param entityPropertys * 泛型对象的List集合 * @param Encode * XML自定义编码类型(推荐使用GBK) * @param XMLPathAndName * XML文件的路径及文件名 */ public void writeXmlDocument(T obj, List entityPropertys, String Encode, String XMLPathAndName) { long lasting = System.currentTimeMillis();// 效率检测
try {
XMLWriter writer = null;// 声明写XML的对象
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(Encode);// 设置XML文件的编码格式
String filePath = XMLPathAndName;// 获得文件地址
File file = new File(filePath);// 获得文件
if (file.exists()) {
file.delete();
}
// 新建student.xml文件并新增内容
Document document = DocumentHelper.createDocument();
String rootname = obj.getClass().getSimpleName();// 获得类名
Element root = document.addElement(rootname + "s");// 添加根节点
Field[] properties = obj.getClass().getDeclaredFields();// 获得实体类的所有属性
for (T t : entityPropertys) { // 递归实体
Element secondRoot = root.addElement(rootname); // 二级节点
for (int i = 0; i < properties.length; i++) {
// 反射get方法
Method meth = t.getClass().getMethod("get" + properties[i].getName().substring(0, 1).toUpperCase()
+ properties[i].getName().substring(1));
// 为二级节点添加属性,属性值为对应属性的值
secondRoot.addElement(properties[i].getName()).setText(meth.invoke(t).toString());
}
}
// 生成XML文件
writer = new XMLWriter(new FileWriter(file), format);
writer.write(document);
writer.close();
long lasting2 = System.currentTimeMillis();
System.out.println("写入XML文件结束,用时" + (lasting2 - lasting) + "ms");
} catch (Exception e) {
System.out.println("XML文件写入失败");
}
}
/**
* 实现读取XML文件得到对象集合
*
* @param XMLPathAndName
* XML文件的路径和地址
* @param t
* 泛型对象
* @return
*/
@SuppressWarnings("unchecked")
public List<T> readXML(String XMLPathAndName, T t) {
long lasting = System.currentTimeMillis();// 效率检测
List<T> list = new ArrayList<T>();// 创建list集合
try {
File f = new File(XMLPathAndName);// 读取文件
SAXReader reader = new SAXReader();
Document doc = reader.read(f);// dom4j读取
Element root = doc.getRootElement();// 获得根节点
Element foo;// 二级节点
Field[] properties = t.getClass().getDeclaredFields();// 获得实例的属性
// 实例的get方法
Method getmeth;
// 实例的set方法
Method setmeth;
for (Iterator i = root.elementIterator(t.getClass().getSimpleName()); i.hasNext();) {// 遍历t.getClass().getSimpleName()节点
foo = (Element) i.next();// 下一个二级节点
t = (T) t.getClass().newInstance();// 获得对象的新的实例
for (int j = 0; j < properties.length; j++) {// 遍历所有孙子节点
// 实例的set方法
setmeth = t.getClass().getMethod("set" + properties[j].getName().substring(0, 1).toUpperCase()
+ properties[j].getName().substring(1), properties[j].getType());
// properties[j].getType()为set方法入口参数的参数类型(Class类型)
setmeth.invoke(t, foo.elementText(properties[j].getName()));// 将对应节点的值存入
}
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
}
long lasting2 = System.currentTimeMillis();
System.out.println("读取XML文件结束,用时" + (lasting2 - lasting) + "ms");
return list;
}
public static void main(String[] args) {
// Dom4jXmlUtil d = new Dom4jXmlUtil(); // // UserTest user = new UserTest(); // //List list = d.readXML("WebRoot\WEB-INF\student.xml", user); // List list = d.readXML("\WEB-INF\classes\templete\user-list-test.xml", user); // System.out.println("XML文件读取结果"); // for (int i = 0; i < list.size(); i++) { // UserTest usename = (UserTest) list.get(i); // System.out.println("name" + usename.getName()); // System.out.println("age" + usename.getAge()); // System.out.println("sax" + usename.getSex()); // }
}
}