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. Winform在一个窗体获取其他窗体的值

    比如:Form2获取Form1 的label的值 因为默认的窗体的所有控件属性和方法都是private, Form1 form1 = new Form1(); 这样也是获取不到的 方法一.最简单的 将 ...

  2. 在Win7下安装IIS

    由于工作上的需要,有朋友在问在windows7系统下如何来配置IIS,大部分用户平时都很少接触到这个功能,所以对于安装配置十分陌生也是在所难免的,下面就让小编与你分享下windows7系统下IIS详细 ...

  3. libpng交叉编译安装

    tar xzf libpng-1.5.22.tar.gz cd libpng-1.5.22 mkdir tmp 打开Makefile文件并修改CC=arm-linux-gcc ./configure ...

  4. Android事件处理--读书笔记

    2013-12-28 17:57:17 1. Android提供了两种方式的事件处理:基于回调和基于监听的事件处理: 1.1 对基于监听的事件处理而言,主要做法是为Android界面组件绑定特定的事件 ...

  5. 从python中copy与deepcopy的区别看python引用

    讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...

  6. python3控制路由器--使用requests重启极路由.py

    代码写了相应的注释,以后再写成可以方便调用的模块. 用fiddler抓包可以看到很多HTTP头,经过尝试发现不是都必须的. 'Upgrade-Insecure-Requests':1,#必要项,值为1 ...

  7. xml文件有误

    Unable to start activity ComponentInfo{com.anzi.jmsht.scripturelibrary/com.anzi.jmsht.scripturelibra ...

  8. Python 类的一些BIF

    issubclass issubclass(cls, class_or_tuple, /) Return whether 'cls' is a derived from another class o ...

  9. vijos 1741 观光公交

    TMD这种题有什么意思啊...敲着都烦啊...感觉啥都没有用就敲完了...光考个贪心有什么意思啊. 反正不想写.NOIP遇到了...管他呢. #include<iostream> #inc ...

  10. socket编程(Linux)

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...