map转XML 工具类(java)

本文介绍了一种将Map数据结构转换为符合XML标准格式的方法,通过递归处理Map和List,实现了复杂数据结构的XML报文生成。适用于数据传输及对接项目中数据格式的灵活转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

之前有个对接项目,数据传输规范都是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("");
				}
			}
		}
    }
}

上述实现是多年前写的; 代码稚嫩, 如有错误,还望指正。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值