package com.baiwang.bop.utils;

import com.baiwang.bop.client.BopException;
import org.dom4j.Element; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; /**
* Created by ChengLuchao on 2017/8/12.
*/
public class XmlUtil { /**
* Element转list
*
* @param root ontnull
* @param clazz ontnull
* @param <T> ontnull
* @return bean
*/
public static <T> List<T> getList(Element root, Class<T> clazz) {
List<T> list = new ArrayList<>();
try {
List<Element> elements = root.elements();
for (int i = 0; i < elements.size(); i++) {
T t = getBean(elements.get(i), clazz);
list.add(t);
}
} catch (Exception e) {
throw new BopException(e);
}
return list;
} /**
* Element转Bean
*
* @param root ontnull
* @param clazz ontnull
* @param <T> ontnull
* @return bean
*/
public static <T> T getBean(Element root, Class<T> clazz) {
try {
T t = clazz.newInstance();
Field[] properties = clazz.getDeclaredFields();
Method setmeth;
String fieldType;
String fieldGenericType;
String className;
for (int i = 0; i < properties.length; i++) {
fieldType = (properties[i].getType() + "");
setmeth = t.getClass().getMethod(
"set"
+ properties[i].getName().substring(0, 1)
.toUpperCase()
+ properties[i].getName().substring(1), properties[i].getType());
if ("interface java.util.List".equals(fieldType)) {
fieldGenericType = properties[i].getGenericType() + "";
String[] sp1 = fieldGenericType.split("<");
String[] sp2 = sp1[1].split(">");
className = sp2[0];
Object listNode = getList(root.element(properties[i].getName()),
Class.forName(className));
setmeth.invoke(t, listNode);
} else {
setmeth.invoke(t, root.elementText(properties[i].getName()));
}
}
return t;
} catch (Exception e) {
throw new BopException(e);
}
} /**
* 判断是否是合法的list
*
*/
public static boolean isList(Element root) {
int type = 0;
if (root != null) {
List<Element> elements = root.elements();
String elementName;
String elementNameFlag;
if (elements != null && elements.size() > 0) {
elementNameFlag = elements.get(0).getName();
for (int i = 1; i < elements.size(); i++) {
elementName = elements.get(i).getName();
if (elementNameFlag.equals(elementName)) {
// 是list
type = 1;
} else {
if (type == 1) {
throw new BopException(
"This XML is not in the right format,"
+ "please add a parent node for Node of the same name!");
} else {
elementNameFlag = elementName;
}
}
}
}
}
if (type == 1) {
return true;
} else {
return false;
}
}
}

Dom4J XML转bean的更多相关文章

  1. dom4j+反射实现bean与xml的相互转换

    由于目前在工作中一直用的dom4j+反射实现bean与xml的相互转换,记录一下,如果有不正确的地方欢迎大家指正~~~ 一.反射机制 在此工具类中使用到了反射技术,所以提前也看了一些知识点,例如:ht ...

  2. [转]hibernate在eclipse的逆向工程生成hbm.xml和bean类

    原文地址:http://www.xuebuyuan.com/210489.html 以前一直用myelipse,在myeclipse做hibernate逆向工程倒是很顺手了. 可是最近改用eclips ...

  3. 使用Jaxb2进行xml与bean的转义时Date的format设置

    参考http://jackyrong.iteye.com/blog/1826699 JAXB转换JAVA OBJECT到XML的时候,对java.util.Date的转换有些要注意的地方 输出的格式为 ...

  4. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  5. spring学习总结——装配Bean学习三(xml装配bean)

    通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...

  6. Springboot中使用Xstream进行XML与Bean 相互转换

    在现今的项目开发中,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,正常的老式方法是通过获取节点来进行一系列操作,个人感觉太过于复杂.繁琐.推荐一套简单的 ...

  7. XStream进行xml和bean互转

    加入pom <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>x ...

  8. 利用jaxb实现xml和bean的相互转换

    1.使用jar包生成xsd文件 java -jar trang.jar a.xml a.xsd xml格式 生成的xsd文件 2.使用xjc命令生成bean文件 xjc a.xsd 生成的相关bean ...

  9. 第2章—装配Bean—通过XML装配Bean

    通过XML装配Bean ​ 尽管我们在生成Bean的过程中可以用到很多方法,但我们依然需要Spring的XML配置来完善更多的需求,下面就来介绍下XML装配Bean的过程是怎样的. 3.1创建XML配 ...

随机推荐

  1. 7-16 Sort with Swap(0, i)(25 分)

    7-16 Sort with Swap(0, i)(25 分) Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy ...

  2. 在不是modelAttribute的情况下,如何保存页面输入值的方法(多行遍历)

    <c:forEach var="prdRelInfo" items="${goodRelPrdList}" varStatus="s" ...

  3. SpringCloud源码地址

    SpringCloud实战源代码 https://github.com/springcloud/spring-cloud-code.git

  4. python004 Python3 解释器

    Python3 解释器Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/local/python3 目录中.安装完成后,我们可以 ...

  5. 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧

    zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...

  6. POJ 1080 Human Gene Functions 【dp】

    题目大意:每次给出两个碱基序列(包含ATGC的两个字符串),其中每一个碱基与另一串中碱基如果配对或者与空串对应会有一个分数(可能为负),找出一种方式使得两个序列配对的分数最大 思路:字符串动态规划的经 ...

  7. D. Spongebob and Squares--cf599D(数学)

    http://codeforces.com/problemset/problem/599/D 题目大意:给你一个数k  让你求一个n*m的矩形里面包含k个正方形   输出有几个这样的矩形  分别是什么 ...

  8. POJ 1502 水 dij

    题意:给N,表示N个节点. 给半个邻接矩阵,本身到本身的距离是0,边是双向的.当两个节点之间没有直接的边连接的时候,用x表示. 问从第一个节点到其他所有节点至少花费的时间. 这题唯一的处理是处理邻接矩 ...

  9. Nginx配置upstream实现负载均衡及keepalived实现nginx高可用

    (原文链接:http://www.studyshare.cn/blog-front//blog/details/1159/0 ) 一.准备工作 1.准备两个项目,发布到不同的服务器上,此处使用2个虚拟 ...

  10. 数据库中的DDL/DML/DCL解释(转)

    DDL is Data Definition Language statements. Some examples:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 1.CREATE - ...