Dom4J解析xml文件动态转换为List或者Map集合

时间:2022-09-01 21:44:04
大家在解析大量相似xml文件的时候是否会遇到这样一个问题:冗余的代码去set定义的实体对象Bean的值,基本都是一样的操作
 
而且毫无任何代码价值可言所以在这写了一个简单的例子,类封装了几个方法你只需传入xml文件,或者URL路径。和Bean.Class 类名
 
即可自动传回你需要的List集合。
 
需要解析的xml文件
 
<?xml version="1.0" encoding="UTF-8"?>
<messages>
    <resultCode>0</resultCode>
    <totalCount>2</totalCount>
    <UserLists>
        <UserList>
            <userId>0</userId>
            <loginName>张三0</loginName>
            <email>qsina0@sina.com</email>
            <userType>1</userType>
            <status>1</status>
            <roleType>1</roleType>
            <registerIP>192.168.1.0</registerIP>
            <registerTime>2012-06-07 15:35:33</registerTime>
        </UserList>
        <UserList>
            <userId>1</userId>
            <loginName>张三1</loginName>
            <email>qsina1@sina.com</email>
            <userType>1</userType>
            <status>1</status>
            <roleType>1</roleType>
            <registerIP>192.168.1.1</registerIP>
            <registerTime>2012-06-07 15:35:33</registerTime>
        </UserList>
    </UserLists>
</messages>
 
在进行相关操作中需要如下包:
 
 下面是贴出的代码:
 
package com.jeecms.common.util;
 
import java.lang.reflect.Field;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
public class XmlParseUtil {
    /**
     * 反射设置实体不同类型字段的值 <暂时只支持 日期 字符串 boolean Integer值设置 待扩建>
     * 
     * @param field
     * @param obj
     * @param value
     * @throws Exception
     */
    public static void convertValue(Field field, Object obj, String value)
            throws Exception {
        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (field.getGenericType().toString().equals("class java.lang.Integer")) {
            field.set(obj, Integer.parseInt(value));
        } else if (field.getGenericType().toString().equals("boolean")) {
            field.set(obj, Boolean.parseBoolean(value));
        } else if (field.getGenericType().toString().equals(
                "class java.util.Date")) {
            field.set(obj, sim.parse(value));
        } else {
            field.set(obj, value);
        }
 
    }
 
    /**
     * 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null
     * 
     * @param xml
     * @param cls
     * @return
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static List<?> parseXml2List(String xml, Class<?> cls)
            throws Exception {
        List<Object> lists = null;
        Document doc = DocumentHelper.parseText(xml);
        Element et = doc.getRootElement();
        String root = et.getName();
        // 查看返回码是否为真. 
        List<Element> list = doc.selectNodes("//" + root + "/resultCode");
        if (!list.isEmpty() && list.size() > 0) {
            Element element = list.get(0);
            String returnResult = element.getText();
            if (returnResult.equals("0")) {
                List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s");
                //判断对象父节点是否有包含数据
                if(father!=null&&!father.isEmpty()&&father.size()==1){
                    List<Element> userLists = father.get(0).elements();
                    if (userLists!=null&&!list.isEmpty()) {
                        lists = new ArrayList<Object>();
                        for (Element e : userLists) {
                            List<Element> li = e.elements();
                            Class<?> cl = (Class<?>) Class.forName(cls.getName());
                            Object ob = cl.newInstance();
                            for (Element element2 : li) {
                                String name = element2.getName();
                                String value = element2.getText();
                                Field field = ob.getClass().getDeclaredField(name);
                                field.setAccessible(true);
                                convertValue(field, ob, value);
                            }
                            lists.add(ob);
                        }
                    }
                }
            }
 
        }
        return lists;
    }
 
    /**
     * 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null
     * 
     * @param url
     * @param cls
     * @return
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static List<?> parseXml2List(URL url, Class<?> cls)
            throws Exception {
        List<Object> lists = null;
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(url);
        Element et = doc.getRootElement();
        String root = et.getName();
        // 查看返回码是否为真. 
        List<Element> list = doc.selectNodes("//" + root + "/resultCode");
        if (!list.isEmpty() && list.size() > 0) {
            Element element = list.get(0);
            String returnResult = element.getText();
            if (returnResult.equals("0")) {
                List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s");
                //判断对象父节点是否有包含数据
                if(father!=null&&!father.isEmpty()&&father.size()==1){
                    List<Element> userLists = father.get(0).elements();
                    if (userLists!=null&&!list.isEmpty()) {
                        lists = new ArrayList<Object>();
                        for (Element e : userLists) {
                            List<Element> li = e.elements();
                            Class<?> cl = (Class<?>) Class.forName(cls.getName());
                            Object ob = cl.newInstance();
                            for (Element element2 : li) {
                                String name = element2.getName();
                                String value = element2.getText();
                                Field field = ob.getClass().getDeclaredField(name);
                                field.setAccessible(true);
                                convertValue(field, ob, value);
                            }
                            lists.add(ob);
                        }
                    }
                }
            }
 
        }
        return lists;
    }
    
    /**
     * 解析xml文件返回保存Map的集合,map中可能包含key值为returnCode、desc、totalCount等单字段.
     * 也可能包含存储对象为List<cls>的集合值.
     * 获取List值key cls_List
     * @param requestPath
     * @param cls
     * @return map
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> parseXml2Map(String requestPath,
            Class<?> cls) throws Exception {
        Map<String, Object> maps = new HashMap<String, Object>();
        List<Object> lists = new ArrayList<Object>();
        SAXReader saxReader = new SAXReader();
        //Document doc = saxReader.read(new File(requestPath));
        Document doc = saxReader.read(new URL(requestPath));
        Element et = doc.getRootElement();
        // 标记List是否为空
        // boolean bool = true ;
        // 根节点名字
        List<Element> rList = et.elements();
        for (Element element : rList) {
            List<Element> rLists = element.elements();
            if (!rLists.isEmpty() && rLists.size() > 0) {
                //bool = false;
                // 判断二级节点
                for (Element e : rLists) {
                    List<Element> li = e.elements();
                    Class<?> cl = (Class<?>) Class.forName(cls.getName());
                    Object ob = cl.newInstance();
                    for (Element element2 : li) {
                        String name = element2.getName();
                        String value = element2.getText();
                        Field field = ob.getClass().getDeclaredField(name);
                        field.setAccessible(true);
                        convertValue(field, ob, value);
                    }
                    lists.add(ob);
                }
            } else {
                maps.put(element.getName(), element.getText());
            }
            maps.put(cls.getSimpleName() + "_List", lists);
        }
        return maps;
    }
 
    /**
     * 只获取返回码0为保存成功(true)1为保存失败(false)
     */
    @SuppressWarnings("unchecked")
    public static boolean parseXmlReturnCode(String xml) {
        boolean bool = false;
        try {
            Document doc = DocumentHelper.parseText(xml);
            Element et = doc.getRootElement();
            String root = et.getName();
            // 查看返回码是否为真.
            List<Element> list = doc.selectNodes("//" + root + "/resultCode");
            if (!list.isEmpty() && list.size() > 0) {
                Element element = list.get(0);
                String returnResult = element.getText();
                if (returnResult.equals("0")) {
                    bool = true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bool;
    }
}

Dom4J解析xml文件动态转换为List<Bean>或者Map集合的更多相关文章

  1. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  2. 用DOM4J解析XML文件案例

    用DOM4J解析XML文件案例,由于DOM4J不像JAXP属于JAVASE里,所以如果要使用DOM4J,则必须额外引入jar包,如图:

  3. 使用DOM4J解析XMl文件与读取XML文件

    XML文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ...

  4. Dom4j解析Xml文件,Dom4j创建Xml文件

    Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...

  5. Java进阶&lpar;二十七&rpar;使用Dom4j解析XML文件

    使用Dom4j解析XML文件 写在前面的话 由于论文实验要求,需要实现操作XML文档,为此想到了dom4j这个工具,使用之后深感受益.在此分享给大家,以此共勉. 注:本文转载自http://blog. ...

  6. 使用dom4j 解析xml文件

    //使用dom4j 解析xml文件,升级版,dom4j是对dom的封装 //重点 package com.offcn.utils; import java.io.File; import java.i ...

  7. dom4j 解析XML文件

    <?xml version="1.0" encoding="UTF-8"?> <!-- 手机的根节点 --> <Phones&gt ...

  8. 用dom4j解析xml文件并执行增删改查操作

    转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...

  9. 【java项目实战】dom4j解析xml文件,连接Oracle数据库

    简单介绍 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方.我们还是看一下官方给出的解释.例如以下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT ...

随机推荐

  1. 磁盘的读写-想起了SGA PGA DBWR LGWR&period;&period;&period;

    衡量性能的几个指标的计算中我们可以看到一个15k转速的磁盘在随机读写访问的情况下IOPS竟然只有140左右,但在实际应用中我们却能看到很多标有5000IOPS甚至更高的存储系统,有这么大IOPS的存储 ...

  2. 【BZOJ-2440】完全平方数 容斥原理 &plus; 线性筛莫比乌斯反演函数 &plus; 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  3. VBA对象模型(1)

    关于对象和集合的比喻 Excel的基本单元是Workbook对象:在快餐连锁店中,基本的单元是单个餐馆.使用Excel可以添加工作簿和关闭工作簿,所有打开的工作簿组成了Workbooks集合(Work ...

  4. Python生成器以及yield语句

    生成器是一种暂缓求值的技术,它可以用来生成一系列的值,但不会一次性生成所有的值,而只在需要的时候才计算和生成一个值. 通过yield语句构建生成器 要得到一个生成器,我们需要定义一个函数,这个函数返回 ...

  5. PHP 点滴疑惑

    在数据库中,字段为NULL,可以使用empty()进行判断 <?php $CONFIG['hostname'] = 'localhost'; $CONFIG['username'] = 'roo ...

  6. Installation error INSTALL&lowbar;FAILED&lowbar;VERSION&lowbar;DOWNGRADE错误

    最近折腾了一下Robotium自动化测试框架,发现问题还挺多,刚刚解决了一个问题,总算是把环境搞定了,可是一运行测试用例,发现又报Installation error INSTALL_FAILED_V ...

  7. 读取oracle页面或者进程卡住不动&lpar;死锁&rpar;

    oracle最坑爹的地方:你insert   update  delete之后  或者kill死锁的时候记得一定要提交事务不然就是死锁卡在那里了 记住  kill死锁也是要提交事务的 select * ...

  8. MSSQL - 逻辑主键、业务主键和复合主键

    转载自:http://blog.csdn.net/sunrise918/article/details/5575054 这几天对逻辑主键.业务主键和复合主键进行了一些思考,也在网上搜索了一下相关的讨论 ...

  9. 快速构建Windows 8风格应用33-构建锁屏提醒

    原文:快速构建Windows 8风格应用33-构建锁屏提醒 引言 Windows Phone(8&7.5)和Windows 8引入了锁屏概念,其实做过Windows Phone 7.5应用开发 ...

  10. 洛谷 p2196 挖地雷 题解

    好久没有写博客了,今天水几篇博客 传送门 挖地雷这个题之前在  信息学奥赛一本通  上做过几乎一样的题,但是由于数据太水导致我当时过了,进而导致我昨天(4.28)考试丢了20分,今天写一篇题解 这个挖 ...