大家在解析大量相似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. @gettrcname.sql

    http://www.eygle.com/archives/2007/05/script_gettrcname.html 最近有很多朋友问起<深入浅出Oracle>一书中的一个脚本gett ...

  2. jquery load 加载改造,只加载body

    背景: 项目中大量用到了jquery和easyui组件,原生load经常出现主页面异常,原因是组件被重复初始化.也考虑过用iframe,但是在实际项目中的效果,最终取消了iframe方案,也尝试了其他 ...

  3. servers无法输入server name

    Here is the workaround that worked for me: Close Eclipse In {workspace-directory}/.metadata/.plugins ...

  4. 学习python之练习(二)

    #2.已知a1=1,a2=2,an=a(n-1)+a(n-2)(n>=3),求数列{a1,a2,a3....an}的总和 import math arr = [0]*100 num = 0 fo ...

  5. Emmet基本使用方法

      Emmet基本使用方法 分类: 其他文章2013-10-29 14:53 4048人阅读 评论(0) 收藏 举报 转载来自:http://www.iteye.com/news/27580 Emme ...

  6. PHP ftp使用

    本文章来总结几个利用php中的ftp功能来实现通过FTP上传文件,有需要学习的朋友可参考参考.ftp_get() 函数从 FTP 服务器上下载一个文件.若成功则返回 true,失败则返回 false. ...

  7. Java 字符串用逗号并接

    for (int t = 0; t < memberLen; t++) {  memTemp = stafferMap.get(strMember[t]);  if(memTemp != nul ...

  8. tomee 第一个 远程调用 Message-driven bean(MDB)

    MDB 整体结构 HelloMDB.java package cn.zno; import javax.jms.Connection; import javax.jms.ConnectionFacto ...

  9. 【转】require.js学习笔记(二)

    require.js遵循AMD规范,通过define定义模块,require异步加载模块,一个js文件即一个模块. 一.模块加载require1.加载符合AMD规范模块 HTML: <scrip ...

  10. SQL Server 利用游标解决Tempdb究极竞争-DBA-程序员需知

    SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点 ...