map转XML报文
背景
之前有个对接项目,数据传输规范都是XML报文,但是获取数据返回格式都是map,数据格式转化就成了一个很让人恶心的问题;于是,想到 可不可以直接吧map直接转化成XML , 于是 有了以下的实践。
talk is cheap,show me the code
话不多说,上代码
package com.inspur.sz.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.collections.MapUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class XmlUtil {
/**
*
* <br>
* <p>Description: Map转XML报文;/n 要求:map格式需要严格遵守XML标准,即Map只能有一个节点作为XML根节点
* <br> <a href=mailto:wangguancong@inspur.com>王冠聪</a><br>
* <p>Date: 2017年8月19日 下午4:22:05<br/>
* <p>
* @param map
* @return
* @throws Exception
* @see String
*/
@SuppressWarnings({ "unchecked", "deprecation" })
public static String Map2Xml(Map<String, Object> map) throws Exception {
String xmlStr = "";
Document doc = DocumentHelper.createDocument();
// 如果map为空返回错误
if (MapUtils.isEmpty(map)) {
Element errorElement = doc.addElement("ERROR");
errorElement.setText("数据为空,请检查参数");
return doc.asXML();
}
Set<Entry<String, Object>> entries = map.entrySet();
// XML规范中有这么一句 : XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。故 传入map 必须为一个树形结构,且只有一个根节点
if (entries.size() > 1) {
Element errorElement = doc.addElement("ERROR");
errorElement.setText("数据格式错误,XML报文中不允许出现多个根节点");
return doc.asXML();
}
// 遍历根节点(其实只有一个) 并创建节点添加到doc中
for(Entry<String, Object> entry : entries){
Element root = doc.addElement(entry.getKey());
if (entry.getValue() instanceof HashMap) {
castMap2Xml((Map<String, Object>) entry.getValue(),root);
}
xmlStr = doc.asXML();
}
return xmlStr;
}
/**
*
*[概述]: 转化map为xml对象
* @param map
* @param element
*/
@SuppressWarnings("unchecked")
private static void castMap2Xml(Map<String, Object> map , Element element) {
// 遍历map中的所有key , 并逐个创建element对象
for (Entry<String, Object> entry : map.entrySet()){
// 判断对象类型,如果是map 则进行递归,如果是list, 专家list数据为element 否则,判定为普通文本内容直接添加
if (entry.getValue() instanceof HashMap) {
Element subElement = element.addElement(entry.getKey());
castMap2Xml((Map<String, Object>) entry.getValue(), subElement);
}else if (entry.getValue() instanceof ArrayList) {
castList2Xml((List<Object>) entry.getValue(), element , entry.getKey());
}else {
Element subElement = element.addElement(entry.getKey());
if (null!= entry.getValue()) {
String value = HtmlCast2String.castHtml2Str(entry.getValue().toString(),false);
subElement.setText(value);
}else {
subElement.setText("");
}
}
}
}
/**
*
*[概述]: 转化list为xml对象
* @see void
*/
@SuppressWarnings("unchecked")
private static void castList2Xml(List<Object> list , Element element , String keyValue) {
// 遍历list ,并根据list中元素类型做不同处理
for (int i = 0; i < list.size(); i++) {
Object object = list.get(i);
if (object instanceof HashMap) {
Element itElement = element.addElement(keyValue);
castMap2Xml((Map<String, Object>) object, itElement);
}else if (object instanceof ArrayList) {
castList2Xml((List<Object>) object, element , keyValue);
}else {
Element itElement = element.addElement(keyValue);
if (null!= object) {
String value = HtmlCast2String.castHtml2Str(object.toString(),false);
itElement.setText(value);
}else {
itElement.setText("");
}
}
}
}
}
上述实现是多年前写的; 代码稚嫩, 如有错误,还望指正。。。