基于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)相关推荐

  1. dom4j工具类_基于DOM4J的XML文件解析类

    XML文件解析分四类方式:DOM解析:SAX解析:JDOM解析:DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于ja ...

  2. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...

    一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...

  3. Java制作报表系统流程_基于JAVA报表生成系统设计与实现.doc

    基于JAVA报表生成系统设计与实现 摘 要 现在是信息社会,各种信息都需要处理并直观展现,如股票,物价等信息都需要通过数据报表来展现.分析,因此高质量报表软件系统具有重要的实际意义. 本论文课题研究探 ...

  4. java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文

    基于JAVA开发的电信IP计费系统设计毕业论文 本科毕业设计(论文)基于 JAVA 开发的电信 IP 计费系统毕业设计(论文)任务书学院:信息科学与工程学院 系级教学单位:电子与通信工程学号学生姓名专 ...

  5. java实现系统参数的存储_基于ZooKeeper,Spring设计实现的参数系统

    一.简介 基于ZooKeeper服务端.ZooKeeper Java客户端以及Spring框架设计的用于系统内部进行参数维护的系统. 二.设计背景 在我们日常开发的系统内部,开发过程中最常见的一项工作 ...

  6. java velocity是什么意思_基于 Java 的模板引擎Velocity快速入门

    最近使用Velocity模板引擎,写一个maven项目Coding生成工具. 对基于Java的模板引擎Velocity的demo总结如下: Step1. 创建Maven项目,添加如下velocity的 ...

  7. java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现

    60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...

  8. java建站集成包_基于Java的快速建站框架实现(含源文件).doc

    武汉纺织大学2010届毕业设计论文 PAGE \* MERGEFORMAT 16 1 概述 1.1 课题背景 随着IT技术和互联网应用的蓬勃发展,类似Blog.BBS等类型的个人型网站的需求量也越来越 ...

  9. java烟草库存数据库设计_基于java的烟草销售管理系统的设计与实现 - 图文

    江西财经大学普通本科毕业设计 图5-2 商品销售窗体 5.3 用户信息 用户信息可以依据员工编号,姓名,所属组进行查询.页面有删除.添加和修改功能,点击不一样的按钮可进入相对应的页面. 图5-3 用户 ...

最新文章

  1. VSC 1.0 (netapp存储在vSphere vCenter 4上的插件)
  2. dedecms系统环境需求及注意事项是什么
  3. Ardino基础教程 23_步进电机
  4. AF_UNIX和AF_INET
  5. 数码相机控制点的自动定位检校
  6. YASnippet - emacs 的代码片段管理工具
  7. TensorFlow Hub介绍:TensorFlow中可重用的机器学习模块库
  8. matlab 离散傅里叶变换_Matlab中的傅里叶变换
  9. Python Numpy中transpose()函数的使用
  10. matlab 算法转 c语言,matlab
  11. # 研究杂感 × DEA-Malmquist
  12. 买哪个股票稳赚,三类股票,可以买了
  13. gmsk仿真matlab,GMSK系统的建模与仿真MATLAB程序
  14. 现代opengl 设计 assimp 3D 模型加载库
  15. 点亮LED灯(LED)
  16. mysql group by 和 having 使用注意事项
  17. HBase系列(一):HBase表结构及数据模型的理解
  18. 上云安全吗?看看亚马逊云科技是如何回答的
  19. adg不同系统_数据库ADG实施手册
  20. 关于BS结构系统的会话机制(session机制)

热门文章

  1. 解析Excel_Poi
  2. mssql 动态行转列。
  3. 【NOIP2016提高A组模拟10.15】算循环
  4. Java —— Reflect反射机制
  5. 亲和数[HDU2040]
  6. C#泛型学习实例(简单易懂)
  7. [转载] 康威的人生游戏与轻量级模式
  8. 建立时间和保持时间关系详解
  9. SDR与DDR的区别
  10. What is Closure