java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)
基于dom4j的xml映射实体的工具类(java)
工具是基于dom4j,使用反射使实体属性与xml的标签关联,目前兼容List,Map后续更新兼容。
历史更新:
发布-2019-6-22
增加注解@XmlAttr关联实体与xml(解决实体名与xml属性名不相同的情况)-2019-7-12
背景故事:这是个大哥与小弟的团队关系
xml文件
大哥
70
小弟1
50
小小弟1-1
45
小小弟1-2
45
小弟2
51
小小弟2-1
50
小小弟2-2
50
实体
1)大哥的实体
import java.util.List;
public class BigBro {
@XmlAttr("name")
private String name;
@XmlAttr("power")
private String power;
@XmlAttr("brolist")
private List brolist;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
public List getBrolist() {
return brolist;
}
public void setBrolist(List brolist) {
this.brolist = brolist;
}
}
2)小弟的实体
import java.util.List;
public class Bro {
@XmlAttr("name")
private String name;
@XmlAttr("power")
private String power;
@XmlAttr("")
private List littlebrolist;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
public List getLittlebrolist() {
return littlebrolist;
}
public void setLittlebrolist(List littlebrolist) {
this.littlebrolist = littlebrolist;
}
}
XmlReader代码
import Annotation.XmlAttr;
import Annotation.XmlAttrImplicit;
import entity.RspPerson;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.StringReader;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class XmlReader {
public XmlReader() {
}
/**
* 映射xml到实体
* @param clazz
* @param xmlStr
* @param
* @return
*/
public T parseToEntity(Class clazz, String xmlStr) {
SAXReader reader = new SAXReader();
reader.setEncoding("GBK");
Document doc;
T obj = null;
try {
obj = clazz.getDeclaredConstructor().newInstance();
doc = reader.read(new StringReader(xmlStr));
Element root = doc.getRootElement();
handleNode(root, obj);
} catch (DocumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
/**
* 处理节点
* @param element
* @param t
* @param
*/
public void handleNode(Element element, T t) {
for (Iterator it = element.elementIterator(); it.hasNext();) {
Element child = it.next();
Field field = null;
try {
field = getFieldByAttrName(child.getName(), t);
if (field == null) {
return ;
}
PropertyDescriptor descriptor = new PropertyDescriptor(field.getName(), t.getClass());
Class> clazz = Class.forName(field.getType().getTypeName());
Object childObject = null;
if (descriptor.getPropertyType().getTypeName().equals("java.util.List")) {
childObject = Proxy.newProxyInstance(RspPerson.class.getClassLoader(), new Class[] {clazz}, new MyHandler());
} else {
childObject = Class.forName(field.getType().getTypeName()).getDeclaredConstructor().newInstance();
}
Method setMethod = descriptor.getWriteMethod(); //获得set方法
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
//带参数类型的属性
ParameterizedType pt = (ParameterizedType)type; //获取参数类型
// System.out.println("带参数" + type.getTypeName());
String paramClassName = pt.getActualTypeArguments()[0].getTypeName(); //获取实体属性的参数类型,如List的A
if (childObject instanceof List) {
ArrayList childList = new ArrayList();
Iterator childIterator = child.elementIterator();
while (childIterator.hasNext()) {
Element sonOfElement = childIterator.next();
System.out.println(sonOfElement.getName());
Object paramObject = Class.forName(paramClassName).getDeclaredConstructor().newInstance();
childList.add(paramObject);
handleNode(sonOfElement, paramObject);
}
setMethod.invoke(t, childList);
} else if (childObject instanceof HashMap){
//HashMap类型属性...
}
} else {
//不带参数类型的属性
// System.out.println("非带参数" + type.getTypeName());
setMethod.invoke(t, child.getData());
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
}
}
}
private Field getFieldByAttrName(String xmlAttrName, T t) {
for (Field f : t.getClass().getDeclaredFields()) {
if (f.isAnnotationPresent(XmlAttr.class)) {
if(f.getAnnotation(XmlAttr.class).value().equals(xmlAttrName)){
return f;
}
} else if (f.isAnnotationPresent(XmlAttrImplicit.class)) {
if (f.getAnnotation(XmlAttrImplicit.class).value().equals(xmlAttrName)){
return f;
}
}
}
return null;
}
}
-MyHandler代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.List;
class MyHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
}
-@XmlAttr 注解
package Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 普通属性,基本数据类型的包装类
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface XmlAttr {
String value() default "";
}
-@XmlAttrImplicit注解
package Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 属性为集合接口List,Map等类型
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface XmlAttrImplicit {
String value() default "";
}
结果
java+基于dom4j工具类_基于dom4j的xml映射实体的工具类(java)相关推荐
- dom4j工具类_基于DOM4J的XML文件解析类
XML文件解析分四类方式:DOM解析:SAX解析:JDOM解析:DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于ja ...
- java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...
一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...
- Java制作报表系统流程_基于JAVA报表生成系统设计与实现.doc
基于JAVA报表生成系统设计与实现 摘 要 现在是信息社会,各种信息都需要处理并直观展现,如股票,物价等信息都需要通过数据报表来展现.分析,因此高质量报表软件系统具有重要的实际意义. 本论文课题研究探 ...
- java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文
基于JAVA开发的电信IP计费系统设计毕业论文 本科毕业设计(论文)基于 JAVA 开发的电信 IP 计费系统毕业设计(论文)任务书学院:信息科学与工程学院 系级教学单位:电子与通信工程学号学生姓名专 ...
- java实现系统参数的存储_基于ZooKeeper,Spring设计实现的参数系统
一.简介 基于ZooKeeper服务端.ZooKeeper Java客户端以及Spring框架设计的用于系统内部进行参数维护的系统. 二.设计背景 在我们日常开发的系统内部,开发过程中最常见的一项工作 ...
- java velocity是什么意思_基于 Java 的模板引擎Velocity快速入门
最近使用Velocity模板引擎,写一个maven项目Coding生成工具. 对基于Java的模板引擎Velocity的demo总结如下: Step1. 创建Maven项目,添加如下velocity的 ...
- java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现
60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...
- java建站集成包_基于Java的快速建站框架实现(含源文件).doc
武汉纺织大学2010届毕业设计论文 PAGE \* MERGEFORMAT 16 1 概述 1.1 课题背景 随着IT技术和互联网应用的蓬勃发展,类似Blog.BBS等类型的个人型网站的需求量也越来越 ...
- java烟草库存数据库设计_基于java的烟草销售管理系统的设计与实现 - 图文
江西财经大学普通本科毕业设计 图5-2 商品销售窗体 5.3 用户信息 用户信息可以依据员工编号,姓名,所属组进行查询.页面有删除.添加和修改功能,点击不一样的按钮可进入相对应的页面. 图5-3 用户 ...
最新文章
- VSC 1.0 (netapp存储在vSphere vCenter 4上的插件)
- dedecms系统环境需求及注意事项是什么
- Ardino基础教程 23_步进电机
- AF_UNIX和AF_INET
- 数码相机控制点的自动定位检校
- YASnippet - emacs 的代码片段管理工具
- TensorFlow Hub介绍:TensorFlow中可重用的机器学习模块库
- matlab 离散傅里叶变换_Matlab中的傅里叶变换
- Python Numpy中transpose()函数的使用
- matlab 算法转 c语言,matlab
- # 研究杂感 × DEA-Malmquist
- 买哪个股票稳赚,三类股票,可以买了
- gmsk仿真matlab,GMSK系统的建模与仿真MATLAB程序
- 现代opengl 设计 assimp 3D 模型加载库
- 点亮LED灯(LED)
- mysql group by 和 having 使用注意事项
- HBase系列(一):HBase表结构及数据模型的理解
- 上云安全吗?看看亚马逊云科技是如何回答的
- adg不同系统_数据库ADG实施手册
- 关于BS结构系统的会话机制(session机制)