java中xml字符串与bean对象的相互转换示例

  1. xml字符串转换成bean对象

public static Object xmlStrToBean(String xmlStr, Class clazz) {  

        Object obj = null;  

        try {  

            // 将xml格式的数据转换成Map对象  

            Map<String, Object> map = xmlStrToMap(xmlStr);  

            //将map对象的数据转换成Bean对象  

            obj = mapToBean(map, clazz);  

        } catch(Exception e) {  

            e.printStackTrace();  

        }  

        return obj;  

}  

  1. xml转换成map对象

public static Map<String, Object> xmlStrToMap(String xmlStr) throws Exception {  

List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();

Map<String, Object> map = new HashMap<String, Object>();

        if(BaseUtil.isEmpty(xmlStr)) {  

            return null;  

        }  

        //将xml格式的字符串转换成Document对象  

        Document doc = DocumentHelper.parseText(xmlStr);

        //获取根节点  

        Element root = doc.getRootElement();  

        //获取根节点下的所有元素  

        List children = root.elements();  

        //循环所有子元素  

        ifChildrenNodes(children,resultList,map);

        return map;  

}  

private static void ifChildrenNodes(List children, List<Map<String, Object>> resultList,Map<String, Object> map){

     if(!BaseUtil.isListEmpty(children)) {  

            for(int i = 0; i < children.size(); i++) {  

                Element child = (Element)children.get(i);  

                if(!BaseUtil.isListEmpty(child.elements())){

                 map = new HashMap<String, Object>();

                  List childrenNodes = child.elements();  

                  if(!BaseUtil.isListEmpty(childrenNodes)) {

                  for(int j = 0; j < childrenNodes.size(); j++) {  

                  Element child2 = (Element)childrenNodes.get(j);

                  map.put(child2.getName(), child2.getTextTrim());  

                  }

                  }

                  resultList.add(map);

                }

            }  

        }  

    }

  1. 将map对象通过反射机制转换成bean

/**

     * 将Map对象通过反射机制转换成Bean对象

     *  

     * @param map 存放数据的map对象

     * @param clazz 待转换的class

     * @return 转换后的Bean对象

     * @throws Exception 异常

     */  

    public static Object mapToBean(Map<String, Object> map, Class clazz) throws Exception {  

        Object obj = clazz.newInstance();  

        if(map != null && map.size() > 0) {  

            for(Map.Entry<String, Object> entry : map.entrySet()) {  

                String propertyName = entry.getKey();  

                Object value = entry.getValue();  

                String setMethodName = "set"  

                        + propertyName.substring(0, 1).toUpperCase()  

                        + propertyName.substring(1);  

                Field field = getClassField(clazz, propertyName);  

                Class fieldTypeClass = field.getType();  

                value = convertValType(value, fieldTypeClass);  

                clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);  

            }  

        }  

        return obj;  

    }  

      

    /**

     * 将Object类型的值,转换成bean对象属性里对应的类型值

     *  

     * @param value Object对象值

     * @param fieldTypeClass 属性的类型

     * @return 转换后的值

     */  

    private static Object convertValType(Object value, Class fieldTypeClass) {  

        Object retVal = null;  

        if(Long.class.getName().equals(fieldTypeClass.getName())  

                || long.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Long.parseLong(value.toString());  

        } else if(Integer.class.getName().equals(fieldTypeClass.getName())  

                || int.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Integer.parseInt(value.toString());  

        } else if(Float.class.getName().equals(fieldTypeClass.getName())  

                || float.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Float.parseFloat(value.toString());  

        } else if(Double.class.getName().equals(fieldTypeClass.getName())  

                || double.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Double.parseDouble(value.toString());  

        } else {  

            retVal = value;  

        }  

        return retVal;  

}    

  1. 获取指定字段名称查找在class中的对应的Field对象

/**

     * 获取指定字段名称查找在class中的对应的Field对象(包括查找父类)

     *  

     * @param clazz 指定的class

     * @param fieldName 字段名称

     * @return Field对象

     */  

    private static Field getClassField(Class clazz, String fieldName) {  

        if( Object.class.getName().equals(clazz.getName())) {  

            return null;  

        }  

        Field []declaredFields = clazz.getDeclaredFields();  

        for (Field field : declaredFields) {  

            if (field.getName().equals(fieldName)) {  

                return field;  

            }  

        }  

  

        Class superClass = clazz.getSuperclass();  

        if(superClass != null) {// 简单的递归一下  

            return getClassField(superClass, fieldName);  

        }  

        return null;  

}

  1. map转换成xml

/**

     * 将map转为xmlstr

     * @param map

     * @param sb

     */

    public static void mapToXMLStr(Map map, StringBuffer sb) {  

        Set set = map.keySet();  

        for (Iterator it = set.iterator(); it.hasNext();) {  

            String key = (String) it.next();  

            Object value = map.get(key);  

            if (null == value)  

                value = "";  

            if (value.getClass().getName().equals("java.util.ArrayList")) {  

                ArrayList list = (ArrayList) map.get(key);  

                sb.append("<" + key + ">");  

                for (int i = 0; i < list.size(); i++) {  

                    HashMap hm = (HashMap) list.get(i);  

                    mapToXMLStr(hm, sb);  

                }  

                sb.append("</" + key + ">");  

  

            } else {  

                if (value instanceof HashMap) {  

                    sb.append("<" + key + ">");  

                    mapToXMLStr((HashMap) value, sb);  

                    sb.append("</" + key + ">");  

                } else {  

                    sb.append("<" + key + ">" + value + "</" + key + ">");  

                }  

  

            }  

  

        }  

}  

  1. 完全运用

package com.cisdi.standingBook.common.utils;

 

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;

 

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

 

import com.cisdi.base.util.BaseUtil;

 

/**

 * xml数据转换工具

 *

 * @author xiangjz

 *

 */

public class XmlUtil {

 

private static Map<String, Object> map;

private static List<Map<String, Object>> resultList;

 

/**

     * xml字符串转换成bean对象

     *  

     * @param xmlStr xml字符串

     * @param clazz 待转换的class

     * @return 转换后的对象

     */  

    public static Object xmlStrToBean(String xmlStr, Class clazz) {  

        Object obj = null;  

        try {  

            // 将xml格式的数据转换成Map对象  

            Map<String, Object> map = xmlStrToMap(xmlStr);  

            //将map对象的数据转换成Bean对象  

            obj = mapToBean(map, clazz);  

        } catch(Exception e) {  

            e.printStackTrace();  

        }  

        return obj;  

    }  

    

    /**

     * 将xml格式的字符串转换成List<Map<String, Object>>对象

     *  

     * @param xmlStr xml格式的字符串

     * @return List<Map<String, Object>>对象

     * @throws Exception 异常

     */

    public static List<Map<String, Object>> xmlStrToList(String xmlStr) throws Exception {  

        if(BaseUtil.isEmpty(xmlStr)) {  

            return null;  

        }  

        resultList = new ArrayList<Map<String, Object>>();  

        

        //将xml格式的字符串转换成Document对象  

        Document doc = DocumentHelper.parseText(xmlStr);

        //获取根节点  

        Element root = doc.getRootElement();  

        //获取根节点下的所有元素  

        List children = root.elements();  

        //循环所有子元素  

        ifChildrenNodes(children);

        return resultList;  

    }

      

    /**

     * 将xml格式的字符串转换成Map对象

     *  

     * @param xmlStr xml格式的字符串

     * @return Map对象

     * @throws Exception 异常

     */  

    public static Map<String, Object> xmlStrToMap(String xmlStr) throws Exception {  

        if(BaseUtil.isEmpty(xmlStr)) {  

            return null;  

        }  

//        Map<String, Object> map = new HashMap<String, Object>();  

        map = new HashMap<String, Object>();

        //将xml格式的字符串转换成Document对象  

        Document doc = DocumentHelper.parseText(xmlStr);

        //获取根节点  

        Element root = doc.getRootElement();  

        //获取根节点下的所有元素  

        List children = root.elements();  

        //循环所有子元素  

        ifChildrenNodes(children);

        return map;  

    }  

    

    private static void ifChildrenNodes(List children){

     if(!BaseUtil.isListEmpty(children)) {  

            for(int i = 0; i < children.size(); i++) {  

                Element child = (Element)children.get(i);  

                if(!BaseUtil.isListEmpty(child.elements())){

                 map = new HashMap<String, Object>();

                  List childrenNodes = child.elements();  

                  if(!BaseUtil.isListEmpty(childrenNodes)) {

                  for(int j = 0; j < childrenNodes.size(); j++) {  

                  Element child2 = (Element)childrenNodes.get(j);

                  map.put(child2.getName(), child2.getTextTrim());  

                  }

                  }

                  resultList.add(map);

                }

            }  

        }  

    }

      

    /**

     * 将Map对象通过反射机制转换成Bean对象

     *  

     * @param map 存放数据的map对象

     * @param clazz 待转换的class

     * @return 转换后的Bean对象

     * @throws Exception 异常

     */  

    public static Object mapToBean(Map<String, Object> map, Class clazz) throws Exception {  

        Object obj = clazz.newInstance();  

        if(map != null && map.size() > 0) {  

            for(Map.Entry<String, Object> entry : map.entrySet()) {  

                String propertyName = entry.getKey();  

                Object value = entry.getValue();  

                String setMethodName = "set"  

                        + propertyName.substring(0, 1).toUpperCase()  

                        + propertyName.substring(1);  

                Field field = getClassField(clazz, propertyName);  

                Class fieldTypeClass = field.getType();  

                value = convertValType(value, fieldTypeClass);  

                clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);  

            }  

        }  

        return obj;  

    }  

      

    /**

     * 将Object类型的值,转换成bean对象属性里对应的类型值

     *  

     * @param value Object对象值

     * @param fieldTypeClass 属性的类型

     * @return 转换后的值

     */  

    private static Object convertValType(Object value, Class fieldTypeClass) {  

        Object retVal = null;  

        if(Long.class.getName().equals(fieldTypeClass.getName())  

                || long.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Long.parseLong(value.toString());  

        } else if(Integer.class.getName().equals(fieldTypeClass.getName())  

                || int.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Integer.parseInt(value.toString());  

        } else if(Float.class.getName().equals(fieldTypeClass.getName())  

                || float.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Float.parseFloat(value.toString());  

        } else if(Double.class.getName().equals(fieldTypeClass.getName())  

                || double.class.getName().equals(fieldTypeClass.getName())) {  

            retVal = Double.parseDouble(value.toString());  

        } else {  

            retVal = value;  

        }  

        return retVal;  

    }  

  

    /**

     * 获取指定字段名称查找在class中的对应的Field对象(包括查找父类)

     *  

     * @param clazz 指定的class

     * @param fieldName 字段名称

     * @return Field对象

     */  

    private static Field getClassField(Class clazz, String fieldName) {  

        if( Object.class.getName().equals(clazz.getName())) {  

            return null;  

        }  

        Field []declaredFields = clazz.getDeclaredFields();  

        for (Field field : declaredFields) {  

            if (field.getName().equals(fieldName)) {  

                return field;  

            }  

        }  

  

        Class superClass = clazz.getSuperclass();  

        if(superClass != null) {// 简单的递归一下  

            return getClassField(superClass, fieldName);  

        }  

        return null;  

    }

    

    /**

     * 将map转为xmlstr

     * @param map

     * @param sb

     */

    public static void mapToXMLStr(Map map, StringBuffer sb) {  

        Set set = map.keySet();  

        for (Iterator it = set.iterator(); it.hasNext();) {  

            String key = (String) it.next();  

            Object value = map.get(key);  

            if (null == value)  

                value = "";  

            if (value.getClass().getName().equals("java.util.ArrayList")) {  

                ArrayList list = (ArrayList) map.get(key);  

                sb.append("<" + key + ">");  

                for (int i = 0; i < list.size(); i++) {  

                    HashMap hm = (HashMap) list.get(i);  

                    mapToXMLStr(hm, sb);  

                }  

                sb.append("</" + key + ">");  

  

            } else {  

                if (value instanceof HashMap) {  

                    sb.append("<" + key + ">");  

                    mapToXMLStr((HashMap) value, sb);  

                    sb.append("</" + key + ">");  

                } else {  

                    sb.append("<" + key + ">" + value + "</" + key + ">");  

                }  

  

            }  

  

        }  

    }  

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值