用dom4j及反射机制将xml转换成JavaBean



import java.io.File;

import java.io.FileWriter;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.sql.Timestamp;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

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;

/**

* xml和javabean之间转换的工具类

* @author

* @param <T>

*/

public class BeanXmlUtils<T> {

private static DateFormat DF = new SimpleDateFormat("yyyy-MM-dd");

/**

*   * @param obj     泛型对象

* @param entityPropertys  泛型对象的List集合

* @param Encode    XML自定义编码类型(推荐使用GBK)

* @param XMLPathAndName  XML文件的路径及文件名

*/

public void writeXmlDocument(T obj, List<T> 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文件写入失败");

}

}

/**

* @param XMLPathAndName   XMLPathAndName XML文件的路径和地址

* @param t        泛型对象

* @return

*/

public List<T> readXML(String objNodeStr,String xmlStr, 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读取

/*               Document doc = null;

// 下面的是通过解析xml字符串的

doc = DocumentHelper.parseText(XMLPathAndName); // 将字符串转为XML

*/

//File f = new File(XMLPathAndName);//读取文件

SAXReader reader = new SAXReader();

//Document doc = reader.read(f);//dom4j读取

Document doc = DocumentHelper.parseText(xmlStr);

Element root = doc.getRootElement();//获得根节点

//Element dataEle = root.element("Data"); // 获取根节点下的子节点Data

//Element yhjzpbEle = dataEle.element(tr1); // 获取Data节点下的子节点yhjzpb

Element foo;//二级节点

Field[] properties = t.getClass().getDeclaredFields();//获得实例的属性

//实例的get方法

Method getmeth;

//实例的set方法

Method setmeth;

//System.out.println(t.getClass().getSimpleName());

// String text = yhjzpbEle.getText();

//System.err.println(text);

for (Iterator i = root.elementIterator(objNodeStr); 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类型)

//System.err.println(properties[j].getType());

String proName = properties[j].getName().toUpperCase();//类的属性名字字符串

Object setStr = foo.elementText(proName);

if(properties[j].getType()==java.sql.Timestamp.class && foo.elementText(proName) != null){

Timestamp ts = new Timestamp(DF.parse(foo.elementText(proName)).getTime());

setStr = ts;

}

if(properties[j].getType()==int.class){

if(foo.elementText(proName) != null && !"".equals(foo.elementText(proName))){

int intts = Integer.parseInt(foo.elementText(proName));

setStr = intts;

}else{

setStr = 0;

}

}

setmeth.invoke(t, setStr);//将对应节点的值存入

}

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) {

String xml = new TestWebService().readXML("file/testBean.xml");

BeanXmlUtils<XmlBean>  beanXmlUtils=new BeanXmlUtils<XmlBean>();

XmlBean testBean=new XmlBean();

List<XmlBean> list=beanXmlUtils.readXML("Record",xml,testBean);

for(XmlBean xb: list){

System.out.println(xb.getId());

}

}*/

}

时间: 2024-10-30 16:12:27

用dom4j及反射机制将xml转换成JavaBean的相关文章

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]

List转DataTable(反射) ; 将泛型集合类转换成DataTable ; 将集合类转换成DataTable

#region 将集合类转换成DataTable /// <summary> /// 将集合类转换成DataTable /// </summary> /// <param name="list">集合</param> /// <returns></returns> public static DataTable ToDataTable(IList list) { DataTable result = new Dat

XML转换成数组方法

<?php function xmlToArray2($xml) { // 将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition

在服务器端将XML转换成HTML

以下是在服务器上转换XML文件所需要的简单源代码: <% 'Load the XML set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = false xml.load(Server.MapPath("cd_catalog.xml")) 'Load the XSL set xsl = Server.CreateObject("Microsoft.XMLDOM") xsl.

JavaScript实现将xml转换成html table

JavaScript实现将xml转换成html table表格的方法. function ConvertToTable(targetNode) {  // if the targetNode is xmlNode this line must be removed  // i couldnt find a way to parse xml string to xml node  // so i parse xml string to xml document  targetNode = targ

C#将XML转换成JSON转换XML

原文:C#将XML转换成JSON转换XML using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using Newtonsoft.Json; namespace JSonConverter { class Program { static void Main(string[] args) { string xml = "<Test>

gson和fastjson将json对象转换成javaBean 简单对照

同事离职,项目后端部分的迭代和重构后面由我接手. 今天看项目代码时,发现项目使用了Gson,用于将json字符串转换成javaBean. 以前没使用过Gson,随即,简单入了个们, 想起fastjson也有将json字符串转换成javaBean的API,随即简单比较了下源码. fastjson中的API如下: /** * @since 1.2.9 */ public <T> T toJavaObject(Class<T> clazz) { return TypeUtils.cast

poi excel自动转换成javabean 支持引用类型属性二级转换

最近项目需要使用excel导入功能,导入学生的时候需要指定所在班级,使用excel一次性导入! 将以前的代码改改支持属性内引用类的转换. 测试对象为User对象,javabean结构: private String username; private int id; private String name; private Date birthday; private long height; private double salary; private User user; 使用测试代码: M

dom4j将xml转换成对象

package test; import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.tree.DefaultAttribute; public