Java实现xml与map互转

此文档中包含单层和多层嵌套情况下,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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CGAL的三维点集

CGAL提供了几种处理点集的算法&#xff0c;从形状检测到通过标准点集处理工具进行的表面重建。 虽然这些算法不强制使用特定的数据结构&#xff0c;但该软件包提供了一个3D点集结构&#xff0c;使用户更容易处理附加属性&#xff0c;如法向量、颜色、标签&#xff0c;并在其上调…

2018年AI智商将达到多少?未来智能实验室启动第三次世界AI智商评测

来源&#xff1a; 人工智能学家 概要&#xff1a;21世纪以来&#xff0c;人工智能领域陆续爆发很多重要事件。其中最吸引人们眼球的&#xff0c;当属2016年战胜了人类围棋冠军并开始能够从0自我学习的AlphaGo。 一.人工智能能否超越人类智慧的争议 21世纪以来&#xff0c;人工智…

二进制函数_Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表...

书接前文&#xff0c;本文主要介绍 Go 二进制文件中 Meta Information 的解析&#xff0c;与函数符号和源码文件路径列表的提取。最后详细介绍一下 Moduledata 这个结构。传送门&#xff1a;Go二进制文件逆向分析从基础到进阶——综述05Meta information>>>>5.1 Go…

学习网址

深入讲解权限&#xff1a; http://www.noahweb.net/mail/2/Project.htm#biaoStruts2 源码分析 http://blog.csdn.net/wl_ldy/article/details/5948779 Struts2部分源码讲解&#xff1a;http://code.google.com/p/struts2-src-study/source/browse/trunk/struts2-src-study--u…

七大科技巨头统治世界?

来源&#xff1a;亿欧智库 概要&#xff1a;我想无论是业内人士还是普通用户&#xff0c;都会思考为什么是他们成为最大的公司&#xff1f; 2017年秋天&#xff0c;随着腾讯和阿里巴巴两家中国公司市值的不断上涨&#xff0c;全球市值头部公司刚好是七大科技巨头&#xff08;下…

vue 懒人_Vue.js 中的实用工具方法【推荐】

收集日常开发中常用到的一些工具方法, 包含 vue 的公用过滤器、公用指令等 (PS: 懒人养成记)公用自定义过滤器import Vue from vueimport moment from moment/*** filter dateFormat 时间格式化* param {String, Date} value 可被 new Date 解析的字符串* param {String} forma…

用户权限管理——DB设计篇

来源&#xff1a;http://www.noahweb.net/mail/2/Project.htm#biao B/S系统中的权限比C/S中的更显的重要&#xff0c;C/S系统因为具有特殊的客户端&#xff0c;所以访问用户的权限检测可以通过客户端实现或通过客户端服务器检测实现&#xff0c;而B/S中&#xff0c;浏览器是每一…

oracle数据库常用的语法与复合函数

oracle查用到一些复合函数以及一些常用的方法用来快速查询数据&#xff0c;以下是我收集的一下常用方法&#xff0c;推荐给大家&#xff1a; 1、 当分组之后&#xff0c;针对某一属性值进行合并并以逗号进行分割&#xff1a; &#xff08;1&#xff09;所有版本都可使用&…

spring 事务之@transactional的使用与回滚

一、事务简单介绍 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要不全部成功&#xff0c;要不全部不成功。 1.1 事务基本要素 原子性(Atomicity): 事务开始后所有操作&#xff0c;要么全部做完&#xff0c;要么全部不做&#xff0c;不可能停滞在…

python可视化图形界面_Python PyQt5 Designer 可视化图形界面模块

PYQT5 Designer简介强大的可视化GUI设计工具, 帮助我们快速开发PyQt.它生成UI界面为.ui文件, 通过命令将.ui转为.py文件.准备工作安装PyQt5: pip install pyqt5安装Qt工具: pip install pyqt5-tools(坑提示&#xff1a;一开始安装的pyqt5版本高了&#xff0c;结果安装QT工具的时…

雷克世界:Gyrfalcon加入芯片角斗场,又一款改变AI界的产品问世

来源&#xff1a;雷克世界 概要&#xff1a;随着人工智能产业规模扩大&#xff0c;众多巨头和初创公司纷纷加入人工智能芯片领域。 随着人工智能产业规模扩大&#xff0c;众多巨头和初创公司纷纷加入人工智能芯片领域&#xff0c;今天来了解一家旨在开发低成本、低功耗、高性能…

Freemarker静态化页面的使用

Freemarker 是一种基于模板的&#xff0c;用来生成输出文本的通用工具&#xff0c;所以我们必须要定制符合自己业务的模板&#xff0c;然后生成自己的文本&#xff08;html页面&#xff0c;string字符串&#xff0c;xml文本等等&#xff09;。Freemarker是通过freemarker.templ…

SessionHelper

问题描述&#xff1a; strut2 的织入 Session 为原始 Map 类型&#xff0c;没有泛型化&#xff0c;在添加属性时就会有一个恼人的警告。 功能&#xff1a; 1、安全的消除警告 2、插入时检查类型&#xff0c;如果不符就提前报错&#xff08;免得取值时才报转换异常的错误&…

报告怎么看_体检报告怎么看? 超实用的阅读指南来了!

体检报告怎么看&#xff1f;超实用的阅读指南来了&#xff01;要点概括除了禁食禁水可以吞口水吗&#xff1f;这样的问题&#xff0c;还有胆固醇、甘油三酯、胆红素…这些指标都是什么意思&#xff1f;出现升高或降低提示了怎样的身体变化&#xff1f;九图带你读懂&#xff01;…

从基础设施的演变,看人工智能到底需要什么样的底层平台

来源&#xff1a;亿欧 概要&#xff1a;大数据、大容量存储、弹性计算和各类算法的发展&#xff0c;尤其是在深度学习领域的发展&#xff0c;带来了各类脑洞大开的创新应用。 机器学习和人工智能的时代已经到来。大数据、大容量存储、弹性计算和各类算法的发展&#xff0c;尤其…

前后台加解密的使用--SHA256算法 RSA算法 AES算法

SHA256算法 sha256与md5一样是散列算法&#xff0c;不是加密算法&#xff0c;不存在解密的问题&#xff0c;因此是不可逆的&#xff0c;可以通过keypassword&#xff0c;对密码进行加密&#xff0c;在后台进行比对&#xff0c;安全性比md5高一点&#xff0c;加密后生成的密文为…

性能测量工具类——TimeMeasureUtil TimeMeasureProxy

TimeMeasureUtil&#xff1a;做单次时间测量。 1、为了能确保 startTime 和 endTime 都正确设置&#xff0c;因而采用实例对象来实现。每次测量是都能判断对象是否处在正确状态。 2、该类为工具类&#xff0c;即使测试时产生许多对象实例也对软件无任何影响。 public class T…

如何看屈曲因子_Abaqus 非线性屈曲分析方法

通常情况下&#xff0c;我们只用关注产品结构本身的强度和刚度满足一定的要求或标准即可。但实际工程中&#xff0c;对于像细长类的结构、薄壁结构&#xff0c;我们还得考虑它的稳定性问题&#xff0c;这也就是我们通常所说的失稳问题或者塌陷问题。在有限元分析中&#xff0c;…

人类首张脑电波连接全图问世

来源&#xff1a;科技日报 概要&#xff1a;美国宾夕法尼亚大学的神经学家根据300名接受神经外科手术患者大脑中30000个电极的数据&#xff0c;绘制出第一张脑电波连接全图。 美国国防部高级研究计划局&#xff08;DARPA&#xff09;资助的、与“恢复活跃记忆”相关的大脑研究项…