自动将String类型的XML解析成实体类
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解析成实体类的更多相关文章
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- 将String类型的XML解析并设置到实体类中
package com.mooc.string; import java.util.ArrayList; import java.util.List; import org.dom4j.Documen ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- WebApi系列~FromUri参数自动解析成实体的要求
回到目录 关于webapi我之前写了一些文章,大家可以根据目录去浏览,今天要说的是个怪问题,也是被我忽略的一个问题,当你的Url参数需要被Api自动解析成实体的属性,实事上是要有条件的,不是所以属性都 ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体
GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...
- Oracle使用Sql把XML解析成表(Table)的方法
SELECT * FROM XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING XMLTYPE('<?xml version="1.0&qu ...
- GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高。
GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...
- 【转】java内存分配和String类型的深度解析
一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本 ...
随机推荐
- IOC(控制反转和依赖注入)之Autofac
Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://co ...
- Drag+Drop和MouseClick
项目中的一个树形结节,既要响应拖拽事件.又要响应点击事件.实现的时候没多想,依次实现了tree_MouseClick.tree_MouseDown.tree_MouseMove事件.出现的Bug是,偶 ...
- Android之sdcard操作
private static final String FILENAME = "abc.txt"; private static final String DIR = " ...
- Xlistview的values下的界面
<!-- 下拉刷新,上拉加载更多 --> <string name="xlistview_header_hint_normal">下拉刷新</s ...
- 黑客界大拿tombkeeper文章:怎么学好技术成为技术大拿(题目我自拟的)
这两天论坛上又有人开始抱怨世风日下,大家都现实了,都不开放了,不交流了.对这种“月经贴”,我基本上已经习惯了,不过因为吃了粉皮炖鸡,心情比较好,于是就说了两句. 三四年前,当时我对人性的看法还不像现在 ...
- 常错-UIScrollView中得图片不能被拖动
经常在开发中,发现自己UIScrollView里面的图片不能被拖动 在这里做个备忘,第一种可能是contentSize没有设置,第二种可能是contentSize设置的太小了. 测试后发现,与user ...
- Introduction to Machine Learning
Chapter 1 Introduction 1.1 What Is Machine Learning? To solve a problem on a computer, we need an al ...
- C# Sandboxer
public static string IsolateCallV1(PageContentHandler pHandler) { string name = Guid.NewGuid().ToStr ...
- 登陆sqlserver及修改端口号 (转)
在一台计算机上面同时安装两个sql server数据库实例,第一次安装默认为机器名,端口号为1433 1.如果不知道服务器名,却想登陆的话可以直接输入127.0.0.1登陆之后,在新建查询中输入:SE ...
- poj2193
//Accepted 368K 532MS //线性dp //dp[i][j]表示前i位最后一个是j的排列数 //dp[i][j]=sum(dp[i-1][h]) h*2<=j #include ...