XmlMapConverter(Map与Xml互转)

2020-07-28  本文已影响0人  knock

XmlMapConverter.java

package cn.microvideo.etc.util;


import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.StringWriter;
import java.util.*;


/**
 * title: XmlMap
 * projectName maven_web
 * description: TODO
 * date 2019/8/6 15:02
 *
 * @author yanyd
 * @since 1.0
 */

public class XmlMapConverter {

    private static final String DEFAULT_XML_ROOT_NAME = "Document";
    private static final String DEFAULT_XML_ENCODING = "UTF-8";
    private static final OutputFormat DEFAULT_OUTPUT_FORMAT;
    private static final String DEFAULT_LIST_NAME = "Value";

    static{
        DEFAULT_OUTPUT_FORMAT = new OutputFormat("  ", true);
        DEFAULT_OUTPUT_FORMAT.setEncoding(DEFAULT_XML_ENCODING);
    }

    /**
     * MAP->XML
     * @param map map
     * @param rootName 根节点名称
     * @return XML(String)
     * @throws Exception
     */
    public static String mapToXml(Map<String, Object> map, String rootName) throws Exception {
        return mapToXml(map, rootName, DEFAULT_OUTPUT_FORMAT);
    }

    /**
     * MAP->XML
     * @param map map
     * @param rootName 根节点名称
     * @param outputFormat 输出格式
     * @return XML(String)
     * @throws Exception
     */
    public static String mapToXml(Map<String, Object> map, String rootName, OutputFormat outputFormat) throws Exception {
        if (map == null){
            throw new RuntimeException("[XmlMapConverter]can't convert null map into xml");
        }
        if (rootName == null || rootName.length() <= 0){
            rootName = DEFAULT_XML_ROOT_NAME;
        }
        Element root = DocumentHelper.createElement(rootName);
        Document document = DocumentHelper.createDocument(root);

        convert(map, root, rootName);

        StringWriter stringWriter = new StringWriter();
        XMLWriter xmlWriter = new XMLWriter(stringWriter, outputFormat);
        xmlWriter.write(document);
        xmlWriter.close();
        return stringWriter.toString();
    }

    private static void convert(Object obj, Element element, String elementName) {
        if (obj == null || element == null){
            return;
        }
        if (obj instanceof Map){
            if (((Map)obj).size() <= 0){
                return;
            }
            for (Object entry : ((Map)obj).entrySet()){
                String name = String.valueOf(((Map.Entry) entry).getKey());
                Object data = ((Map.Entry) entry).getValue();
                if (data instanceof Map) {
                    convert(data, element.addElement(name), name);
                } else if (data instanceof List){
                    convert(data, element, name);
                } else {
                    Element subElement = element.addElement(name);
                    data=data==null?"":data;
                    subElement.addText(String.valueOf(data));
                }
            }
        }else if(obj instanceof List){
            if (((List)obj).size() <= 0){
                return;
            }
            for (Object data : ((List)obj)){
                if (data instanceof Map) {
                    convert(data, element.addElement(elementName), elementName);
                } else if (data instanceof List){
                    convert(data, element.addElement(elementName), DEFAULT_LIST_NAME);
                } else {
                    Element subElement = element.addElement(elementName);
                    data=data==null?"":data;
                    subElement.addText(String.valueOf(data));
                }
            }
        }
    }

    public static Map<String, Object> xmlToMap(String xml) throws Exception {
        if (xml == null || xml.length() <= 0){
            throw new Exception("[XmlMapConverter]can't convert null xml into map");
        }
        Document document = DocumentHelper.parseText(xml);
        Element root = document.getRootElement();
        Map<String, Object> map = new HashMap<String, Object>();
        convert(root, map);
        return map;
    }

    private static void convert(Element element, Map<String, Object> map){
        if (element == null || map == null){
            return;
        }
        List subElements = element.elements();
        if (subElements == null || subElements.size() <= 0){
            return;
        }
        for (Object subElement : subElements){
            if (!(subElement instanceof Element)) {
                continue;
            }
            String name = ((Element) subElement).getName();
            Object data = null;
            if (((Element) subElement).isTextOnly()){
                data = ((Element) subElement).getData();
            }else{
                data = new HashMap<String, Object>();
                convert((Element)subElement, (Map<String, Object>)data);
            }
            Object preData = map.remove(name);
            if (preData != null){
                if (preData instanceof List){
                    ((List) preData).add(data);
                    map.put(name, preData);
                }else{
                    List list = new ArrayList();
                    list.add(preData);
                    list.add(data);
                    map.put(name, list);
                }
            }else if (data != null){
                map.put(name, data);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        HashMap<String,Object> map=new HashMap<>();
        List<String> list=new ArrayList<>();

        map.put("k",null);
        System.out.println(mapToXml(map,""));
    }
}


pom.xml

 <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>

上一篇下一篇

猜你喜欢

热点阅读