package com.mooc.freemarker2dto;

public class BaseDto {

}
package com.mooc.freemarker2dto;

public class Book extends BaseDto{

    private String name;
private String author;
private String year;
private float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
} public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Book [name=" + name + ", author=" + author + ", year=" + year + ", price=" + price + "]";
} }
package com.mooc.freemarker2dto;

import java.util.ArrayList;
import java.util.List; public class ResultDto { private String Count;
private List<BaseDto> detailData = new ArrayList();
public String getCount() {
return Count;
}
public void setCount(String count) {
Count = count;
}
public List<BaseDto> getDetailData() {
return detailData;
}
public void setDetailData(List<BaseDto> detailData) {
this.detailData = detailData;
} }
<?xml version="1.0" encoding="utf-8"?>

<bookstore>
<books count="2">
<book>
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book>
<name>安徒生童话</name>
<author>安徒生</author>
<year>2014</year>
<price>69</price>
</book>
</books>
</bookstore>
package com.mooc.freemarker2dto;

public class User extends BaseDto{

    private String name;
private char sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
} }
package com.mooc.freemarker2dto;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element; public class DtoUtils { public static ResultDto parserDto(String repsponseXml,BaseDto baseDto) throws Exception{
Document doc = DocumentHelper.parseText(repsponseXml);
Element rootElement = doc.getRootElement();
ResultDto resultDto = new ResultDto();
for (Iterator<Element> i = rootElement.elementIterator(); i.hasNext();) {
Element monits = (Element) i.next();
element2Dto(monits, resultDto,baseDto);
}
return resultDto;
} public static void element2Dto(Element element,ResultDto resultDto,BaseDto baseDto) throws Exception{
List<Attribute> bean = new ArrayList<Attribute>();
bean = element.attributes();
if(bean.size()>0){
resultDto.setCount(bean.get(0).getStringValue());
}
if(element.hasContent()){
List<Element> list = element.elements();
for (int i=0;i<list.size();i++){
BaseDto obj = baseDto.getClass().newInstance();
Element base = list.get(i);
if(base.elements().size()>0){
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor property : propertyDescriptors){
//获取属性名
String key = property.getName();
if(base.element(key)!=null){
Object value = base.element(key).getStringValue();
Method setter = property.getWriteMethod();
Class<?>[] params = setter.getParameterTypes();
if (params != null && params.length > 0 && value != null){
Class<?> param = params[0];
System.out.println("param:"+param.getName()+" value:"+value.getClass().getName());
if(param.getName().equals(value.getClass().getName())){
setter.invoke(obj, value);
continue;
}
if (param.getName().equals(Integer.class.getName()) // Integer
|| param.getName().equals(Integer.TYPE.getName())) {
value= Integer.valueOf(value.toString());
} else if (param.getName().equals(Double.class.getName()) // Double
|| param.getName().equals(Double.TYPE.getName())) {
value= Double.valueOf(value.toString());
} else if (param.getName().equals(Float.class.getName()) // Float
|| param.getName().equals(Float.TYPE.getName())) {
value= Float.valueOf(value.toString());
} else if (param.getName().equals(Long.class.getName()) // Long
|| param.getName().equals(Long.TYPE.getName())) {
value= Long.valueOf(value.toString());
}else if (param.getName().equals(Character.class.getName())||param.getName().equals(Character.TYPE.getName())) {
char c[] = value.toString().toCharArray();
if(c.length>0){
value = c[0];
} } setter.invoke(obj, value);
}
}
}
}
resultDto.getDetailData().add(obj); }
} }
}
package com.mooc.freemarker2dto;

import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {
String repsponseXml = "<?xml version='1.0' encoding='UTF-8'?><bookstore><books count='2'><book><name>冰与火之歌</name><author>乔治马丁</author><year>2014</year><price>89</price></book><book><name>安徒生童话</name><author>安徒生</author><year>2014</year><price>69</price></book></books></bookstore>";
String resp = "<?xml version='1.0' encoding='UTF-8'?><bookstore><users count='2'><user><name>小红</name><sex>1</sex><age>22</age></user><user><name>小明</name><sex>1</sex><age>19</age></user></users></bookstore>";
Book book = new Book();
ResultDto resultDto = DtoUtils.parserDto(repsponseXml, book);
System.err.println(resultDto.getCount());
List<BaseDto> baseDtos = resultDto.getDetailData();
for (BaseDto baseDto : baseDtos) {
Book book2 = (Book) baseDto;
System.out.println(book2);
} User user = new User();
ResultDto resultDtos = DtoUtils.parserDto(resp, user);
System.out.println("数量:"+resultDtos.getCount());
List<BaseDto> baseDtoss = resultDtos.getDetailData();
for (BaseDto baseDto : baseDtoss) {
User user2 = (User) baseDto;
System.out.println(user2);
}
} }

自动将String类型的XML解析成实体类的更多相关文章

  1. xml格式报文的拼装,和解析成实体类

    我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...

  2. 将String类型的XML解析并设置到实体类中

    package com.mooc.string; import java.util.ArrayList; import java.util.List; import org.dom4j.Documen ...

  3. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  4. WebApi系列~FromUri参数自动解析成实体的要求

    回到目录 关于webapi我之前写了一些文章,大家可以根据目录去浏览,今天要说的是个怪问题,也是被我忽略的一个问题,当你的Url参数需要被Api自动解析成实体的属性,实事上是要有条件的,不是所以属性都 ...

  5. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  6. IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体

    GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...

  7. Oracle使用Sql把XML解析成表(Table)的方法

    SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0&qu ...

  8. GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高。

    GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...

  9. 【转】java内存分配和String类型的深度解析

    一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本 ...

随机推荐

  1. 【C语言学习】-03 循环结构

    本文目录 循环结构的特点 while循环 do...while循环 for循环 回到顶部 一.循环结构的特点 程序的三种结构: 顺序结构:顺序执行语句 分支结构:通过进行一个判断在两个可选的语句序列之 ...

  2. java抽象类与接口 详解

    在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题 ...

  3. Struts2标签<s:textfield/>

    中的name="",取值顺序是,如不加#,先从root中栈顶取,没有取到(即使栈顶有这个属性但是属性为空还是向下取,这点和el表达式不同)就去actioncontext的map中取 ...

  4. 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

    Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...

  5. poj2392 多重背包

    //Accepted 868 KB 188 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...

  6. D.T SOFTWARE (1) 软件架构直播答疑课程

    今晚的d.t课程 1项目需求 PPTP服务搭建完成PPTP服务器的搭建,用户重新拨号获得新IP后,要求拔PPTP VPN成功时,也获取到新的公网IP,而且能通过代理上网.VNC服务安装用户可以通过VN ...

  7. UILocalNotification详解

    以下内容来自网络 本地Notification所使用的对象是UILocalNotification,UILocalNotification的属性涵盖了所有处理Notification需要的内容.UIL ...

  8. HDU 5086

    http://acm.hdu.edu.cn/showproblem.php?pid=5086 求所有连续区间的数字和 本质是一个乘法原理,当前位置的数字出现次数=这个数之前的数字个数*这个数之后的数字 ...

  9. HDU 4911

    http://acm.hdu.edu.cn/showproblem.php?pid=4911 一场多校的签到题,树状数组离散化求逆序数 #include <iostream> #inclu ...

  10. C# 控件聚焦

    /********************************************************************** * C# 控件聚焦 * 说明: * 做界面经常需要将ta ...