美文网首页
XmlMapConverter(Map与Xml互转)

XmlMapConverter(Map与Xml互转)

作者: knock | 来源:发表于2020-07-28 23:03 被阅读0次

    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>
    
    

    相关文章

      网友评论

          本文标题:XmlMapConverter(Map与Xml互转)

          本文链接:https://www.haomeiwen.com/subject/ndhcrktx.html