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

 /*** 将Map转换为XML,Map可以多层转* @param params 需要转换的map。* @param parentName 就是map的根key,如果map没有根key,就输入转换后的xml根节点。* @return String-->XML*/
@SuppressWarnings("unchecked")
public static String createXmlByMap(Map<String, Object> map,String parentName) {//获取map的key对应的valueMap<String, Object> rootMap=(Map<String, Object>)map.get(parentName);if (rootMap==null) {rootMap=map;}Document doc = DocumentHelper.createDocument();//设置根节点doc.addElement(parentName);String xml = iteratorXml(doc.getRootElement(), parentName, rootMap);return formatXML(xml);
}/*** 循环遍历params创建xml节点* @param element 根节点* @param parentName 子节点名字* @param params map数据* @return String-->Xml*/
@SuppressWarnings("unchecked")
public static String iteratorXml(Element element, String parentName,Map<String, Object> params) {Element e = element.addElement(parentName);Set<String> set = params.keySet();for (Iterator<String> it = set.iterator(); it.hasNext();) {String key = (String) it.next();if (params.get(key) instanceof Map) {iteratorXml(e, key, (Map<String, Object>) params.get(key));} else if (params.get(key) instanceof List) {List<Object> list = (ArrayList<Object>) params.get(key);for (int i = 0; i < list.size(); i++) {iteratorXml(e, key, (Map<String, Object>) list.get(i));}} else {String value = params.get(key) == null ? "" : params.get(key).toString();e.addElement(key).addText(value);// e.addElement(key).addCDATA(value);}}return e.asXML();
}/*** 格式化xml* @param xml* @return*/
public static String formatXML(String xml) {String requestXML = null;XMLWriter writer = null;Document document = null;try {SAXReader reader = new SAXReader();document = reader.read(new StringReader(xml));if (document != null) {StringWriter stringWriter = new StringWriter();OutputFormat format = new OutputFormat(" ", true);// 格式化,每一级前的空格format.setNewLineAfterDeclaration(false); // xml声明与内容是否添加空行format.setSuppressDeclaration(false); // 是否设置xml声明头部 false:添加format.setNewlines(true); // 设置分行writer = new XMLWriter(stringWriter, format);writer.write(document);writer.flush();requestXML = stringWriter.getBuffer().toString();}return requestXML;} catch (Exception e1) {e1.printStackTrace();return null;} finally {if (writer != null) {try {writer.close();} catch (IOException e) {}}}
}/*** 第二种* 手动组装map转为string* @param map* @return*/
public static String moveMapToXML(Map<?, ?> map) {StringBuffer sb = new StringBuffer();mapToXML(map, sb);return formatXML(sb.toString());
}/*** * @param map 循环遍历map节点和value* @param sb 输出xml*/
private static void mapToXML(Map<?, ?> map, StringBuffer sb) {Set<?> set = map.keySet();for (Iterator<?> it = set.iterator(); it.hasNext();) {String key = (String) it.next();Object value = map.get(key);if (value instanceof HashMap) {sb.append("<" + key + ">");mapToXML((HashMap<?, ?>) value, sb);sb.append("</" + key + ">");} else if (value instanceof ArrayList) {List<?> list = (ArrayList<?>) map.get(key);for (int i = 0; i < list.size(); i++) {sb.append("<" + key + ">");Map<?, ?> hm = (HashMap<?, ?>) list.get(i);mapToXML(hm, sb);sb.append("</" + key + ">");}} else {sb.append("<" + key + ">" + value + "</" + key + ">");}}
}/*** 通过XML转换为Map<String,Object>* @param xml 为String类型的Xml* @return 第一个为Root节点,Root节点之后为Root的元素,如果为多层,可以通过key获取下一层Map*/
public static Map<String, Object> createMapByXml(String xml) {Document doc = null;try {doc = DocumentHelper.parseText(xml);} catch (DocumentException e) {e.printStackTrace();}Map<String, Object> map = new HashMap<String, Object>();if (doc == null)return map;Element rootElement = doc.getRootElement();elementTomap(rootElement, map);return map;
}/**** XmlToMap核心方法,里面有递归调用* @param map* @param ele*/
@SuppressWarnings("unchecked")
public static Map<String, Object> elementTomap(Element outele,Map<String, Object> outmap) {List<Element> list = outele.elements();int size = list.size();if (size == 0) {outmap.put(outele.getName(), outele.getTextTrim());} else {Map<String, Object> innermap = new HashMap<String, Object>();for (Element ele1 : list) {String eleName = ele1.getName();Object obj = innermap.get(eleName);if (obj == null) {elementTomap(ele1, innermap);} else {if (obj instanceof java.util.Map) {List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();list1.add((Map<String, Object>) innermap.remove(eleName));elementTomap(ele1, innermap);list1.add((Map<String, Object>) innermap.remove(eleName));innermap.put(eleName, list1);} else {elementTomap(ele1, innermap);((List<Map<String, Object>>) obj).add(innermap);}}}outmap.put(outele.getName(), innermap);}return outmap;
}

java递归多层(多节点)xml和map互相转换相关推荐

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

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

  2. Java实现xml与map互转

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

  3. java解析xml转为Map

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

  4. JAVA对象集合转化为xml转换_xml转为Map集合以及对象转化为xml

    1.[代码][Java]代码 package com.fang.util; import java.io.InputStream; import java.util.HashMap; import j ...

  5. java 递归遍历对象所有属性_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...

    xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd XML文件:SwordLib.xml SwordLibrary SYST ...

  6. java递归遍历xml所有元素_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...

    2019独角兽企业重金招聘Python工程师标准>>> xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd ...

  7. Java为xml跟节点添加子节点_如何将xml节点作为第一个子节点插入Java中的另一个xml文档中?...

    小编典典 如果事实证明我只是为您做功课,我会感到非常恼火. package com.akonizo.examples; import java.io.ByteArrayInputStream; imp ...

  8. java递归获取所有的子级节点

    public class VltavaWisdomMapType {     //站点id     private String id;       //子级集合   private List< ...

  9. java遍历多层map_Java遍历Map对象的四种方式

    文章转自: https://www.cnblogs.com/fqfanqi/p/6187085.html 关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况 ...

最新文章

  1. 英伟达十年力作:新一代光线追踪显卡 Quadro RTX及核心架构Turing,可支持AI运算...
  2. LeetCode-笔记-45.跳跃游戏II-贪心算法
  3. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
  4. PHP性能调优---php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
  5. gearman php mysql_php使用gearman
  6. centos7配置haproxy
  7. Spring依赖注入:注解注入总结
  8. OAuth 2.0 的探险之旅
  9. 地理知识归纳:影响降水的九大因素
  10. 算法高级(41)-推荐算法实现
  11. mysql 数字序列_MySQL中的数字序列
  12. 二叉查找(排序)树/二叉树----建树,遍历
  13. 字符串转HTML段落
  14. Java工程师需要掌握哪些知识和专业技能呢?
  15. Deepfacelab 新手教程【AI智能换脸】
  16. kali使用笔记本自带无线网卡_(小杨推荐)电脑无线上网+蓝牙解决方案
  17. Maya vray 3S皮肤材质球设置与材质节点连接
  18. EM算法在直线分类与灭点检测中的应用(关于一篇文章的读后感)
  19. 差异性分析该如何选择?
  20. 如何将Chrome设为iPhone和iPad上的默认Web浏览器

热门文章

  1. 【51单片机】外部中断
  2. 基于Php门禁系统设计与实现
  3. 【数字化】数字化工厂的框架与落地实践;50张图解读数字化制造
  4. css 变量_如何将CSS变量用于动画
  5. 导数,偏导数,方向导数与梯度的定义与联系
  6. 笨办法学python 粗略笔记(learn python the hard way)
  7. 使用NPOI设置Excel表的单元格背景颜色
  8. PyGobject(十九)布局容器之Alignment
  9. 在cmd命令下imp oracle dmp文件
  10. Unity AR小游戏(玩具小车)踩坑记