java xml、map转换工具类

package com

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.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * xml/map转换工具类
 */
public class XmlMapUtil
{
    /**
     * xml字符串转map
     * @param xml
     * @return
     */
    public static Map xml2map(String xml)
    {
        Document doc = null;
        try
        {
            //将xml字符串转为document对象
            doc = DocumentHelper.parseText(xml);
        }
        catch (DocumentException e)
        {
            LoggerManager.error(XmlMapUtil.class, e, "响应参数解析失败:{}", xml);
        }
        Map map = new HashMap<>();
        if (doc == null)
        {
            return map;
        }
        else
        {
            //获取根节点
            Element rootElement = doc.getRootElement();
            element2map(rootElement, map);
        }
        return map;
    }
    
    /**
     * map转xml字符串
     * @param map
     * @return
     */
    public static String map2xml(Map map, String rootElement)
    {
        StringBuffer xmlStr = new StringBuffer("");
        if (CollectionUtility.isEmpty(map))
            return xmlStr.toString();
        xmlStr.append("<" + rootElement + ">");
        map2Element(map, xmlStr);
        xmlStr.append("");
        return xmlStr.toString();
    }
    
    /**
     * 递归原则 : 一个map对应一个xml节点,key为当前xml节点名,value为当前xml节点子集
     * 如果xml节点没有子节点(叶子节点),那么map的key为xml节点名,value为xml节点文本内容
     * 如果xml节点有一个子节点,那么map的key为xml节点名,value为xml节点子集
     * 如果xml节点有多个子节点,对应map的key不存在(每一次),map的key为xml节点名,value为xml节点子集
     * 如果xml节点有多个子节点,对应map的key已存在,且value为map类型(第二次),map的key为xml节点名,值从map类型转为list,而list中添加2份当前xml节点子集
     * 如果xml节点有多个子节点,对应map的key已存在,且value为list类型(第三/多次),那么直接加到list中去.
     * @param elmt
     * @param map
     * @see [类、类#方法、类#成员]
     */
    @SuppressWarnings("unchecked")
    private static void element2map(Element elmt, Map map)
    {
        if (null == elmt)
        {
            return;
        }
        String name = elmt.getName();
        
        //判断当前节点的内容是否为文本(最里面一层节点)
        if (elmt.isTextOnly())
        {
            map.put(name, elmt.getText());
        }
        else
        {
            Map mapSub = new HashMap<>();
            
            //获取当前节点的所有子节点
            List elements = (List)elmt.elements();
            
            //利用递归获取节点值
            for (Element elmtSub : elements)
            {
                element2map(elmtSub, mapSub);
            }
            Object first = map.get(name);
            
            //判断
            if (null == first)
            {
                map.put(name, mapSub);
            }
            else
            {
                if (first instanceof List)
                {
                    ((List>)first).add(mapSub);
                }
                else
                {
                    List listSub = new ArrayList();
                    listSub.add(first);
                    listSub.add(mapSub);
                    map.put(name, listSub);
                }
            }
        }
    }
    
    /**
     * 递归map转xml字符串
     * @param map
     * @param sb
     */
    @SuppressWarnings("unchecked")
    private static void map2Element(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 instanceof List)
            {
                List list = (List)map.get(key);
                sb.append("<" + key + ">");
                for (int i = 0; i < list.size(); i++)
                {
                    Map hm = (Map)list.get(i);
                    map2Element(hm, sb);
                }
                sb.append("");
            }
            else
            {
                if (value instanceof Map)
                {
                    sb.append("<" + key + ">");
                    map2Element((Map)value, sb);
                    sb.append("");
                }
                else
                {
                    sb.append("<" + key + ">" + value + "");
                }
                
            }
        }
    }
}


你可能感兴趣的:(java,基础)