java通过反射和JDOM解析xml成对象

前言

在工作中有次遇到过webservice传递数据,以xml的格式。字段根据接口来设计,但是我们实体类是自动生成打了jar, 所以对解析时候造成了困难。弄了好久最后选择使用JDOM+反射机制解析。成功执行,总算是弄好了这个大问题
下面是代码
maven依赖

       <dependency>
            <groupId>jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.1</version>
        </dependency>

代码

XmlUtil.java

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import java.io.StringReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Description: 利用反射和JDOM解析xml成bean/List
 * @Date: 2018/1/22 16:06
 */
public class XmlUtil {
    /**
     *  xml转换成bean
     * @param xml
     * @param obj
     * @return
     */
    public static Object xmlToBean(String xml,Class obj){
        SAXBuilder builder=new SAXBuilder();
        Field[] fields = obj.getDeclaredFields();
        String  beanName=obj.getSimpleName();
        try {
            Object object = Class.forName(obj.getName()).newInstance();
            Document doc = builder.build(new StringReader(xml));
            Element books = doc.getRootElement();
            List booklist = books.getChildren(beanName);
            for (Iterator iter = booklist.iterator(); iter.hasNext(); ) {
                Element book = (Element) iter.next();
                for (int j = 0; j < fields.length; j++) {
                    fields[j].setAccessible(true);
                    if (!fields[j].toString().contains("final")) {
                        fields[j].set(object,book.getChildTextTrim(fields[j].getName())==null?"":book.getChildTextTrim(fields[j].getName()));
                    }
                }
            }
            System.out.println(fields.toString());
            return object;
        }catch(Exception e){
     e.printStackTrace();
        }
        return null;
        }
    /**
     * xml转换成list
     * @param xml
     * @param obj
     * @return
     */
    public static List<?> xmlToList(String xml,Class obj){
        SAXBuilder builder=new SAXBuilder();
        Field[] fields = obj.getDeclaredFields();
        String  beanName=obj.getSimpleName();
        try {
            Object object = Class.forName(obj.getName()).newInstance();
            List<Object> list=new ArrayList<Object>();
            Document doc = builder.build(new StringReader(xml));
            Element books = doc.getRootElement();
            List booklist = books.getChildren(beanName);
            for (Iterator iter = booklist.iterator(); iter.hasNext(); ) {
                Element book = (Element) iter.next();
                for (int j = 0; j < fields.length; j++) {
                    fields[j].setAccessible(true);
                    if (!fields[j].toString().contains("final")) {
                        fields[j].set(object,book.getChildTextTrim(fields[j].getName())==null?"":book.getChildTextTrim(fields[j].getName()));
                    }
                }
                list.add(object);
            }
            return list;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
        /**
     * bean转换成xml
     */
     public static String beanToXmls(Object obj){
         Class t=(Class)obj.getClass();
            Field[] fields = t.getDeclaredFields();
            StringBuffer buffer=new StringBuffer();
            buffer.append("<Data><Vehicle>");
            try {
                Object object = Class.forName(obj.getClass().getName()).newInstance();
                    for (int j = 0; j < fields.length; j++) {
                        fields[j].setAccessible(true);
                           String val = fields[j].get(obj)==null?"": fields[j].get(obj)+"";
                            buffer.append("<"+fields[j].getName()+">"+val+"</"+fields[j].getName()+">\n");
                }
                    buffer.append("</Data></Vehicle>");
                return buffer.toString();
            }catch(Exception e){
         e.printStackTrace();
            }
            return null;
            }
    public static void main(String[] args) {
        List<IMType> o= (List<IMType>) xmlToList("<Data> <IMType> <InspectionNum>4416020120130730160935272</InspectionNum>  <StationCode>441600002</StationCode>      <HCEL>0.2</HCEL>    <HCER>0.2</HCER>  <HCED>1</HCED>    <COEL>0.2</COEL>    <COER>0.2</COER>    <COED>1</COED>   <NOXEL>0.2</NOXEL>    <NOXER>0.2</NOXER>   <NOXED>1</NOXED>    <HCNOXEL>0.2</HCNOXEL>    <HCNOXER>0.2</HCNOXER> <HCNOXED>1</HCNOXED> </IMType></Data> ",IMType.class);
        System.out.println(o.get(0).getCOEL());
    }

工具类可自行修改 我是根据需求来写的

顺便实体类也发给你们吧
IMType.java

public class IMType implements Serializable{

    private String id = "";
    private String StationCode = "";
    private String InspectionNum = "";
    private String HCEL = "";
    private String HCER = "";
    private String HCED = "";
    private String COEL = "";
    private String COER = "";
    private String COED = "";
    private String NOXEL = "";
    private String NOXER = "";
    private String NOXED = "";
    private String HCNOXEL = "";
    private String HCNOXER = "";
    private String HCNOXED = "";

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getStationCode() {
        return StationCode;
    }
    public void setStationCode(String stationCode) {
        StationCode = stationCode;
    }
    public String getInspectionNum() {
        return InspectionNum;
    }
    public void setInspectionNum(String inspectionNum) {
        InspectionNum = inspectionNum;
    }
    public String getHCEL() {
        return HCEL;
    }
    public void setHCEL(String hCEL) {
        HCEL = hCEL;
    }
    public String getHCER() {
        return HCER;
    }
    public void setHCER(String hCER) {
        HCER = hCER;
    }
    public String getHCED() {
        return HCED;
    }
    public void setHCED(String hCED) {
        HCED = hCED;
    }
    public String getCOEL() {
        return COEL;
    }
    public void setCOEL(String cOEL) {
        COEL = cOEL;
    }
    public String getCOER() {
        return COER;
    }
    public void setCOER(String cOER) {
        COER = cOER;
    }
    public String getCOED() {
        return COED;
    }
    public void setCOED(String cOED) {
        COED = cOED;
    }
    public String getNOXEL() {
        return NOXEL;
    }
    public void setNOXEL(String nOXEL) {
        NOXEL = nOXEL;
    }
    public String getNOXER() {
        return NOXER;
    }
    public void setNOXER(String nOXER) {
        NOXER = nOXER;
    }
    public String getNOXED() {
        return NOXED;
    }
    public void setNOXED(String nOXED) {
        NOXED = nOXED;
    }
    public String getHCNOXEL() {
        return HCNOXEL;
    }
    public void setHCNOXEL(String hCNOXEL) {
        HCNOXEL = hCNOXEL;
    }
    public String getHCNOXER() {
        return HCNOXER;
    }
    public void setHCNOXER(String hCNOXER) {
        HCNOXER = hCNOXER;
    }
    public String getHCNOXED() {
        return HCNOXED;
    }
    public void setHCNOXED(String hCNOXED) {
        HCNOXED = hCNOXED;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值