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. ssl和https协议详解

    转自:https://cuiyongxiu.com/201102/24157.html ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公司开发的,它的作用主要是提供了一种安全传输 ...

  2. 青蛙跳台阶(Fibonacci数列)

    问题 一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级.求该青蛙跳上一个n 级的台阶总共有多少种跳法. 思路 当n=1时,只有一种跳法,及f(1)=1,当n=2时,有两种跳法,及f(2)=2,当n= ...

  3. hdu 1033 (bit masking, utilization of switch, '\0' as end of c string) 分类: hdoj 2015-06-15 21:47 37人阅读 评论(0) 收藏

    bit masking is very common on the lower level code. #include <cstdio> #include <algorithm&g ...

  4. [VMware WorkStation]虚拟机网络

    桥接模式下复制物理网络连接: 复制物理网卡连接状态,就是说把你指定的.本机的.真是网卡的状态信息复制给虚拟机的虚拟网卡,比如说你的本机真是网卡链接到了家用路由器的LAN口上,获得到了DHCP分配的地址 ...

  5. Android布局— — —线性布局

    以水平或垂直的方式显示界面中的控件 线性布局 语法格式: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  6. 利用NTFS交换数据流隐藏文件

    利用NTFS交换数据流隐藏文件 发表于 2012 年 12 月 15 日 由 晴刃 这篇文章介绍一下Windows的NTFS文件系统的ADS(alternate data streams,交换数据流) ...

  7. C++ shared_ptr deleter的实现

    #include <iostream>#include <memory>using namespace std; #include<iostream>class s ...

  8. Actipro Ribbon For WPF 界面控件免费下载地址

    Actipro Ribbon可以添加ribbon用户界面到你的程序中,功能包含:ribbon大小调整.程序菜单.QAT.嵌入的多种控件.多种布局选项.按键提示.屏幕提示.WPF命令模式用法.多种样式. ...

  9. 表设计VIso

  10. AFNnetworking入门

    AFNetworking官网入门教程简单翻译,学习 AFNetworking 是一个能够快速使用的ios和mac os x下的网络框架,它是构建在Foundation URL Loading Syst ...