自动将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);
        }
    }

}

 

posted on 2016-04-28 13:29  james-roger  阅读(1320)  评论(0编辑  收藏  举报