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>
网友评论