多层map、xml相互转换

代码主要导入的jar为dom4j,代码有注释,我就不解释了。


import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
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;


/**
 * 
 * 提供Map<String,Object>转XML,XML转Map<String,Object>
 * 
 * @author MOSHUNWEI
 * @since 2018-03-09
 * @version 5.0
 */


public class XmlMap {


	/**
	 * 
	 * 通过Map创建XML,Map可以多层转换
	 * 
	 * @param params
	 * @return	String-->XML
	 */
	public static String createXmlByMap(String parentName,Map<String, Object> params,boolean isCDATA){
		Document doc = DocumentHelper.createDocument();
		doc.addElement(parentName);
		String xml = iteratorXml(doc.getRootElement(),parentName,params,isCDATA);
		return formatXML(xml);
	}
	
	/**
	 * 
	 * 通过Map创建XML,Map可以多层转换
	 * 可以自定义parent节点
	 * 
	 * @param params
	 * @return	String-->XML
	 */
	public static String createXmlByMap(String parentName,Map<String, Object> params){
		Document doc = DocumentHelper.createDocument();
		doc.addElement(parentName);
		String xml = iteratorXml(doc.getRootElement(),parentName,params,false);
		return formatXML(xml);
	}
	
	/**
	 * 
	 * 通过Map创建XML,Map可以多层转
	 * 固定节点parent为Document
	 * 
	 * @param params
	 * @return	String-->XML
	 */
	public static String createXmlByMap(Map<String, Object> params){
		String parentName = "Document";
		Document doc = DocumentHelper.createDocument();
		doc.addElement(parentName);
		String xml = iteratorXml(doc.getRootElement(),parentName,params,false);
		return formatXML(xml);
	}
	
	/**
	 * 
	 * MapToXml循环遍历创建xml节点
	 * 此方法在value中加入CDATA标识符
	 * 
	 * @param element 根节点
	 * @param parentName 子节点名字
	 * @param params map数据
	 * @return String-->Xml
	 */
	
	@SuppressWarnings("unchecked")
	public static String iteratorXml(Element element,String parentName,Map<String,Object> params,boolean isCDATA) {
		Element e = element.addElement(parentName);
		Set<String> set = params.keySet();
		for (Iterator<String> it = set.iterator(); it.hasNext();) {
			String key = (String) it.next();
			if(params.get(key) instanceof Map) {
				iteratorXml(e,key,(Map<String,Object>)params.get(key),isCDATA);
			}else {
				String value = params.get(key)==null?"":params.get(key).toString();
				if(!isCDATA) {
					e.addElement(key).addText(value);	
				}else {
					e.addElement(key).addCDATA(value);	
				}
			}
		}
		return e.asXML(); 
	}
	
	/**
	 * 格式化xml,显示为容易看的XML格式
	 * 
	 * @param inputXML
	 * @return
	 */
	public static String formatXML(String inputXML){
		String requestXML = null;
		XMLWriter writer = null;
		Document document = null;
		try {
			SAXReader reader = new SAXReader();
			document = reader.read(new StringReader(inputXML));
			if (document != null) {
				StringWriter stringWriter = new StringWriter();
				OutputFormat format = new OutputFormat("	", true);//格式化,每一级前的空格
				format.setNewLineAfterDeclaration(false);	//xml声明与内容是否添加空行
				format.setSuppressDeclaration(false);		//是否设置xml声明头部
				format.setNewlines(true);		//设置分行
				writer = new XMLWriter(stringWriter, format);
				writer.write(document);
				writer.flush();
				requestXML = stringWriter.getBuffer().toString();
			}
			return requestXML;
		} catch (Exception e1) {
			e1.printStackTrace();
			return null;
		}finally {
			if (writer != null) { 
				try {
					writer.close();
				} catch (IOException e) {
					
				}
			}
		}
	}
 
	
	/** 
	 * 
	* 通过XML转换为Map<String,Object> 
	* 
	* @param xml 为String类型的Xml
	* @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map
	*/  
	public static Map<String, Object> createMapByXml(String xml) {
		Document doc = null;
		try {
			doc = DocumentHelper.parseText(xml);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		Map<String, Object> map = new HashMap<String, Object>();
		if (doc == null)
			return map;
		Element rootElement = doc.getRootElement();
		elementTomap(rootElement,map);
		return map;
	}
	
	/***
	 *  
	 * XmlToMap核心方法,里面有递归调用 
	 *  
	 * @param map 
	 * @param ele 
	 */  
	@SuppressWarnings("unchecked")
	public static Map<String, Object> elementTomap (Element outele,Map<String,Object> outmap) {
		List<Element> list = outele.elements();
		int size = list.size();
		if(size == 0){
			outmap.put(outele.getName(), outele.getTextTrim());
	}else{
		Map<String, Object> innermap = new HashMap<String, Object>();
		for(Element ele1 : list){
			String eleName = ele1.getName();
			Object obj =  innermap.get(eleName);
			if(obj == null){
				elementTomap(ele1,innermap);
			}else{
				if(obj instanceof java.util.Map){
				List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
				list1.add((Map<String, Object>) innermap.remove(eleName));
				elementTomap(ele1,innermap);
				list1.add((Map<String, Object>) innermap.remove(eleName));
				innermap.put(eleName, list1);
			}else{
				elementTomap(ele1,innermap);
				((List<Map<String, Object>>)obj).add(innermap);
			}
		}
	}
		outmap.put(outele.getName(), innermap);
	}
	return outmap;
}
public static void main(String[] args) {
		Map<String,Object> result = new HashMap<String,Object>();
		result.put("Request", "getData");
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("data", "2018-01-01");
		map.put("name", "jack");
		result.put("Data", map);
		System.out.println(createXmlByMap(result));
		System.out.println(createXmlByMap("Parent", result));
		System.out.println(createXmlByMap("Parent", result,true));
		System.out.println(createMapByXml(createXmlByMap(result)));
	}
}

结果为:

<?xml version="1.0" encoding="UTF-8"?>
<Document>
    <Request>getData</Request>
    <Data>
        <data>2018-01-01</data>
        <name>jack</name>
    </Data>
</Document>

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
    <Request>getData</Request>
    <Data>
        <data>2018-01-01</data>
        <name>jack</name>
    </Data>
</Parent>

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
    <Request><![CDATA[getData]]></Request>
    <Data>
        <data><![CDATA[2018-01-01]]></data>
        <name><![CDATA[jack]]></name>
    </Data>
</Parent>

{Document={Request=getData, Data={data=2018-01-01, name=jack}}}




猜你喜欢

转载自blog.csdn.net/qq_40150691/article/details/80813459