大家在解析大量相似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进阶(二十七)使用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> ...

  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. 验证码(网页的某些图片)在ie 360不显示,在火狐下显示正常

    解决办法: 开始->运行,在运行输入框中输入“regsvr32 c:\windows\system32\pngfilt.dll”(不包含双引号),然后点击确定,如果在出现“已加载c:\windo ...

  2. 重写,重载,super,this,继承

    重写:overwrite/override 子类根据需要对从基类继承来的方法进行重写. 重写方法必须与被重写方法有相同的方法名,参数列表和返回类型. 重写方法不能使用比被重写方法更严格的访问权限. 重 ...

  3. VB6.0 读取CSV文件

    最近做了一个Upload文件的需求,文件的格式为CSV,读取文件的方法整理了一下,如下: 1.先写了一个读取CSV文件的Function: '读取CSV文件 '假设传入的参数strFile=C:\Do ...

  4. Centos添加新硬盘、分区、格式化、自动挂载

    创建分区 #fdisk /dev/hdb 格式化新创建的分区 #mkfs.ext3 /dev/hdb1 使新创建的分区挂载/mnt/data01目录下 #mount /dev/hdb1 /mnt/da ...

  5. Linux内核实现中断和中断处理(二)

    第一部分移步传送门召唤!!:http://www.cnblogs.com/lenomirei/p/5562086.html 上回说了Linux内核实现中断会把中断分为两部分进行处理,上回讲了上部分,这 ...

  6. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  7. Class类的理解

      在java中,每个类都有一个相应的Class类的对象,因为每个类编译完成后,在生成的.class文件中,就会产生一个Class对象.     在运行期间,如果我们要产生某个类的对象,jvm会检查类 ...

  8. .net 泛型运用

    DAL层 private DbContext MyContext; public BaseRepository(DbContext context) { MyContext = context; } ...

  9. 利用PHP执行SQL文件,将SQL文件导入到数据库

    如何利用php自动执行.sql文件.其实很简单,就是获取sql文件中的内容,然后将每一句sql语句一次执行就行啦. 这是代码 //读取文件内容 $_sql = file_get_contents('t ...

  10. CALayer图层的基本介绍

    掌握 ● CALayer的基本属性 ● CALayer和UIView的关系 ● position和anchorPoint的作⽤用 CALayer ● 在iOS中,你能看得见摸得着的东西基本上都是UIV ...