此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下:

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import cn.sdk.util.StringUtil;public class XmlUtil {private static final String PREFIX_XML = "<xml>";private static final String SUFFIX_XML = "</xml>";private static final String PREFIX_CDATA = "<![CDATA[";private static final String SUFFIX_CDATA = "]]>";/*** 转化成xml, 单层无嵌套* @param map* @param isAddCDATA* @return*/public static String mapToXml(Map<Object, Object> parm, boolean isAddCDATA) {StringBuffer strbuff = new StringBuffer(PREFIX_XML);if (null != parm) {for (Entry<Object, Object> entry : parm.entrySet()) {strbuff.append("<").append(entry.getKey()).append(">");if (isAddCDATA) {strbuff.append(PREFIX_CDATA);if (null != entry.getValue()) {strbuff.append(entry.getValue());}strbuff.append(SUFFIX_CDATA);} else {if (null != entry.getValue()) {strbuff.append(entry.getValue());}}strbuff.append("</").append(entry.getKey()).append(">");}}return strbuff.append(SUFFIX_XML).toString();}/*** @description 将xml字符串转换成map* @param xml* @return Map*/public static Map<String, String> xml2Map(String xml) {Map<String, String> map = new HashMap<String, String>();Document doc = null;try {doc = DocumentHelper.parseText(xml); // 将字符串转为XMLElement rootElt = doc.getRootElement(); // 获取根节点@SuppressWarnings("unchecked")List<Element> list = rootElt.elements();// 获取根节点下所有节点for (Element element : list) { // 遍历节点map.put(element.getName(), element.getText()); // 节点的name为map的key,text为map的value}} catch (DocumentException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return map;}/*** (多层)xml格式字符串转换为map** @param xml xml字符串* @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map*/public static Map<String, Object> multilayerXmlToMap(String xml) {Document doc = null;try {doc = DocumentHelper.parseText(xml);} catch (DocumentException e) {logger.error("xml字符串解析,失败 --> {}", e);}Map<String, Object> map = new HashMap<>();if (null == doc) {return map;}// 获取根元素Element rootElement = doc.getRootElement();recursionXmlToMap(rootElement,map);return map;}/*** multilayerXmlToMap核心方法,递归调用* * @param element 节点元素* @param outmap 用于存储xml数据的map*/@SuppressWarnings("unchecked")private static void recursionXmlToMap(Element element, Map<String, Object> outmap) {// 得到根元素下的子元素列表List<Element> list = element.elements();int size = list.size();if (size == 0) {// 如果没有子元素,则将其存储进map中outmap.put(element.getName(), element.getTextTrim());} else {// innermap用于存储子元素的属性名和属性值Map<String, Object> innermap = new HashMap<>();// 遍历子元素list.forEach(childElement -> recursionXmlToMap(childElement, innermap));outmap.put(element.getName(), innermap);}}/*** (多层)map转换为xml格式字符串** @param map 需要转换为xml的map* @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入* @return xml字符串*/public static String multilayerMapToXml(Map<String, Object> map, boolean isCDATA){String parentName = "xml";Document doc = DocumentHelper.createDocument();doc.addElement(parentName);String xml = recursionMapToXml(doc.getRootElement(), parentName, map, isCDATA);return formatXML(xml);}/*** multilayerMapToXml核心方法,递归调用** @param element 节点元素* @param parentName 根元素属性名* @param map 需要转换为xml的map* @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入* @return xml字符串*/@SuppressWarnings("unchecked")private static String recursionMapToXml(Element element, String parentName, Map<String, Object> map, boolean isCDATA) {Element xmlElement = element.addElement(parentName);map.keySet().forEach(key -> {Object obj = map.get(key);if (obj instanceof Map) {recursionMapToXml(xmlElement, key, (Map<String, Object>)obj, isCDATA);} else {String value = obj == null ? "" : obj.toString();if (isCDATA) {xmlElement.addElement(key).addCDATA(value);} else {xmlElement.addElement(key).addText(value);}}});return xmlElement.asXML();}/*** 格式化xml,显示为容易看的XML格式** @param xml 需要格式化的xml字符串* @return*/public static String formatXML(String xml) {String requestXML = null;try {// 拿取解析器SAXReader reader = new SAXReader();Document document = reader.read(new StringReader(xml));if (null != document) {StringWriter stringWriter = new StringWriter();// 格式化,每一级前的空格OutputFormat format = new OutputFormat("    ", true);// xml声明与内容是否添加空行format.setNewLineAfterDeclaration(false);// 是否设置xml声明头部format.setSuppressDeclaration(false);// 是否分行format.setNewlines(true);XMLWriter writer = new XMLWriter(stringWriter, format);writer.write(document);writer.flush();writer.close();requestXML = stringWriter.getBuffer().toString();}return requestXML;} catch (Exception e) {logger.error("格式化xml,失败 --> {}", e);return null;}}

Java实现xml与map互转相关推荐

  1. Java实现xml和json互转

    pom.xml: <!-- 使用staxon实现xml和json直接互转 --><dependency><groupId>de.odysseus.staxon< ...

  2. java解析xml转为Map

    之前开发过一个解析多层级xml文件的工具类,后来处理的时候发现,这种方式得到的map或json集合多一个key标签,在解析的时候会比较麻烦,于是根据需要在原有方法的基础上写出了另外的处理方法,总结记录 ...

  3. 微信支付中xml和map互转

    现在用java做微信公众号的支付,支付过程将参数发给微信是以xml格式发送,接受过来的也是xml格式字符串.感觉网上的xml和map转化复杂就手写了一个,具体代码如下: package com.cij ...

  4. 解析xml报文,xml与map互转

    这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 <NTMMessage version="1.03"> <NTMHeader>< ...

  5. java map转xml 工具类_xml和map互转工具类

    /*** xml转map工具类 *@authorzhangyao **/ public classXmlToMapUtil {/*** xml转map 不带属性 *@paramxmlStr *@par ...

  6. Java工具类——通过配置XML验证Map

    Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...

  7. java实现对象转换为map、xml字符串转化为map、map转化为xml字符串

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现map使用功能函数:对象转换为map.xml字符串转化为map 1.将对象的所有属性转化为map键值对 2.转换对象为map,并忽略某 ...

  8. java递归多层(多节点)xml和map互相转换

    具体见代码 调用方法: 第一种map转xml:createXmlByMap(Map<String, Object> map,String parentName); 第二种map转xml:m ...

  9. java xml map 方法_JAVA XML转换MAP 方法

    在开发过程中会调用soap接口,返回的数据就是xml形式,那么久需要对xml进行解析,对xml操作大家都还是比较不是很熟悉相比对于map的操作.所以我提供了这么一个方法,让大家对xml数据提取,转换成 ...

最新文章

  1. fpm定制化RPM包之nginx rpm包的制作
  2. android界面怎么优化字符串,android应用性能优化
  3. CentOS 6.7安装docker
  4. 分类器是如何做检测的?(1)——CascadeClassifier中的detectMultiScale函数解读
  5. 数据结构(字典,跳跃表)、使用场景(计数器、缓存、查找表、消息队列、会话缓存、分布式锁)、Redis 与 Memcached、 键的过期时间、数据淘汰策略、持久化(RDB、AOF)
  6. 空指针:从 0 到 NULL,再到 nullptr
  7. Android使用adb命令安装应用-连接usb
  8. matlab复杂噪声产生实验报告,matlab加入噪声 - 范文中心
  9. 字符串、文件操作,英文词率统计预处理
  10. 如何查看服务器数据库修改密码,如何查看服务器数据库密码
  11. NOIP之旅:NOIP2014篇
  12. springMVC 解决硬编码问题
  13. 损失函数理解汇总,结合 PyTorch1.7 和 TensorFlow2
  14. 876. Middle of the Linked List
  15. kernel的initcall函数
  16. JAVA Eclipse如何设置点击按钮切换图片
  17. spring纯注解+libreoffice
  18. aspeed显卡安装ubuntu驱动
  19. putc与stdin,stdout,stderr
  20. 用python写一个纪念日计算工具!有对象的特别注意了!

热门文章

  1. 论文学习3-Improving Neural Fine-Grained Entity Typing with Knowledge Attention
  2. Python中参数函数内部赋值与使用+=的变量
  3. JMeter4.0以上 分布式测试报错 server failed start Listen failed on port
  4. 用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(二)
  5. jquery filter和not
  6. 第二章 二进制数值和记数系统
  7. 关于Actionscript 3中给Flash传参数方法(一)
  8. 猎取人心的36条黄金法则
  9. 【开始研究Community Server,转贴一点东西】Community Server资料收集
  10. 计算机网络(十七)-局域网