使用dom4j 把xml格式解析为对象或者对象集合

原文链接:https://blog.csdn.net/lixunjing/article/details/49889845

经常会遇到后台传来xml格式的数据,需要我们把它们解析后变成对象或者集合, dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、所以我们用dom4j解析xml,把其转化为对象,或者集合,使用之前导入dom4j.jar架包

  1、把下面的xml 转化为person的对象

<resp>  
    <name>jack</name>  
    <age>21</age>  
    <birthday>1990-02-01</birthday>  
    <sex>man</sex>  
</resp>  

   2、 把下面的xml 转化为person集合

<resp>  
    <desc>0</desc>  
    <depict>ok</depict>  
    <content>  
        <name>jack</name>  
        <age>21</age>  
        <birthday>1990-02-01</birthday>  
        <sex>man</sex>  
    </content>  
    <content>  
        <name>jack</name>  
        <age>21</age>  
        <birthday>1990-02-01</birthday>  
        <sex>man</sex>  
    </content>  
    <content>  
        <name>jack</name>  
        <age>21</age>  
        <birthday>1990-02-01</birthday>  
        <sex>man</sex>  
    </content>  
</resp>  
下面直接贴代码了:

   Person类:

public class Person {  
  
 private String name;  
 private String age;  
 private String birthday;  
 private String sex;  
public String getName() {  
    return name;  
}  
public void setName(String name) {  
    this.name = name;  
}  
public String getAge() {  
    return age;  
}  
public void setAge(String age) {  
    this.age = age;  
}  
public String getBirthday() {  
    return birthday;  
}  
public void setBirthday(String birthday) {  
    this.birthday = birthday;  
}  
public String getSex() {  
    return sex;  
}  
public void setSex(String sex) {  
    this.sex = sex;  
}  

 Dom4jUtil类

import java.io.StringReader;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  
  
import org.dom4j.Document;  
import org.dom4j.DocumentException;  
import org.dom4j.DocumentHelper;  
import org.dom4j.Element;  
import org.dom4j.io.SAXReader;  
import org.xml.sax.InputSource;  
  
public class Dom4jUtil {  
  
    /** 
     * @param args 
     * @throws DocumentException 
     */  
    public static void main(String[] args) throws DocumentException {  
        // TODO Auto-generated method stub  
  
        String xml = "<resp>" + "<name>jack</name>" + "<age>21</age>"  
                + "<birthday>1990-02-01</birthday>" + "<sex>man</sex>"  
                + "</resp>";  
        Person student = getPerson(xml);  
        System.out.println(student.getName() + "|" + student.getAge() + "|"  
                + student.getBirthday() + "|" + student.getSex());  
        System.out.println("person对象");  
        String modelXMl = "<name>jack</name>" + "<age>21</age>"  
                + "<birthday>1990-02-01</birthday>" + "<sex>man</sex>";  
        String xmlList = "<resp>" + "<desc>0</desc>" + "<depict>ok</depict>"  
                + "<content>" + modelXMl + "</content>" + "<content>"  
                + modelXMl + "</content>" + "<content>" + modelXMl  
                + "</content>" + "</resp>";  
        System.out.println("person集合列表");  
        List<Person> list = getPersonList(xmlList);  
        for (Person person : list) {  
            System.out.println(person.getName() + "|" + person.getAge() + "|"  
                    + person.getBirthday() + "|" + person.getSex());  
        }  
    }  
  
    /** 
     * 把xml格式转化为person对象 
     *  
     * @param xml 
     * @return 
     */  
    public static Person getPerson(String xml) {  
        Person person = null;  
        InputSource in = new InputSource(new StringReader(xml));  
        in.setEncoding("UTF-8");  
        SAXReader reader = new SAXReader();  
        Document document;  
        try {  
            document = reader.read(in);  
            Element root = document.getRootElement();  
            person = (Person) XmlUtil.fromXmlToBean(root, Person.class);  
  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
            System.out.println("数据解析错误");  
  
        }  
        return person;  
    }  
  
    /** 
     * 把xml转化为person集合 
     *  
     * @param xml 
     * @return 
     */  
    public static List<Person> getPersonList(String xml) {  
  
        Document doc = null;  
        List<Person> list = new ArrayList<Person>();  
        try {  
  
            // 读取并解析XML文档  
  
            // SAXReader就是一个管道,用一个流的方式,把xml文件读出来  
  
            // SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档  
  
            // Document document = reader.read(new File("User.hbm.xml"));  
  
            // 下面的是通过解析xml字符串的  
  
            doc = DocumentHelper.parseText(xml); // 将字符串转为XML  
  
            Element rootElt = doc.getRootElement(); // 获取根节点  
  
            System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称  
  
            String returnCode = rootElt.elementTextTrim("desc");  
            if (!"0".equals(returnCode)) {  
                System.out.println("后台数据返回有问题");  
                return null;  
            }  
  
            Iterator<Element> it = rootElt.elementIterator("content");// 获取根节点下所有content  
            while (it.hasNext()) {  
                Element elementGroupService = (Element) it.next();  
                Person baseBean = (Person) XmlUtil.fromXmlToBean(  
                        elementGroupService, Person.class);  
                list.add(baseBean);  
            }  
  
        } catch (Exception e) {  
            // TODO: handle exception  
            System.out.println("数据解析错误");  
        }  
  
        return list;  
    }  
  
}  

 XmlUtil类:

import java.lang.reflect.Field;  
import java.util.Date;  
  
import org.dom4j.Element;  
  
public class XmlUtil  
{  
    /** 
     * json 数据转换对象 
     *  
     * @param Element 
     *            要转换的Element数据 
     * @param pojo 
     *            要转换的目标对象类型 
     * @return 转换的目标对象 
     * @throws Exception 
     *             转换失败 
     */  
    @SuppressWarnings("rawtypes")  
    public static Object fromXmlToBean(Element rootElt, Class pojo) throws Exception  
    {  
        // 首先得到pojo所定义的字段  
        Field[] fields = pojo.getDeclaredFields();  
        // 根据传入的Class动态生成pojo对象  
        Object obj = pojo.newInstance();  
        for (Field field : fields)  
        {  
            // 设置字段可访问(必须,否则报错)  
            field.setAccessible(true);  
            // 得到字段的属性名  
            String name = field.getName();  
            // 这一段的作用是如果字段在Element中不存在会抛出异常,如果出异常,则跳过。  
            try  
            {  
                rootElt.elementTextTrim(name);  
            }  
            catch (Exception ex)  
            {  
                continue;  
            }  
            if (rootElt.elementTextTrim(name) != null && !"".equals(rootElt.elementTextTrim(name)))  
            {  
                // 根据字段的类型将值转化为相应的类型,并设置到生成的对象中。  
                if (field.getType().equals(Long.class) || field.getType().equals(long.class))  
                {  
                    field.set(obj, Long.parseLong(rootElt.elementTextTrim(name)));  
                }  
                else if (field.getType().equals(String.class))  
                {  
                    field.set(obj, rootElt.elementTextTrim(name));  
                }  
                else if (field.getType().equals(Double.class) || field.getType().equals(double.class))  
                {  
                    field.set(obj, Double.parseDouble(rootElt.elementTextTrim(name)));  
                }  
                else if (field.getType().equals(Integer.class) || field.getType().equals(int.class))  
                {  
                    field.set(obj, Integer.parseInt(rootElt.elementTextTrim(name)));  
                }  
                else if (field.getType().equals(java.util.Date.class))  
                {  
                    field.set(obj, Date.parse(rootElt.elementTextTrim(name)));  
                }  
                else  
                {  
                    continue;  
                }  
            }  
        }  
        return obj;  
    }  
} 


  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值