java递归多层(多节点)xml和map互相转换
具体见代码
调用方法:
第一种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互相转换相关推荐
- Java工具类——通过配置XML验证Map
Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...
- Java实现xml与map互转
此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下: import java.util.HashMap; import java.util.List; import java. ...
- java解析xml转为Map
之前开发过一个解析多层级xml文件的工具类,后来处理的时候发现,这种方式得到的map或json集合多一个key标签,在解析的时候会比较麻烦,于是根据需要在原有方法的基础上写出了另外的处理方法,总结记录 ...
- JAVA对象集合转化为xml转换_xml转为Map集合以及对象转化为xml
1.[代码][Java]代码 package com.fang.util; import java.io.InputStream; import java.util.HashMap; import j ...
- java 递归遍历对象所有属性_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...
xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd XML文件:SwordLib.xml SwordLibrary SYST ...
- java递归遍历xml所有元素_Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性...
2019独角兽企业重金招聘Python工程师标准>>> xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd ...
- Java为xml跟节点添加子节点_如何将xml节点作为第一个子节点插入Java中的另一个xml文档中?...
小编典典 如果事实证明我只是为您做功课,我会感到非常恼火. package com.akonizo.examples; import java.io.ByteArrayInputStream; imp ...
- java递归获取所有的子级节点
public class VltavaWisdomMapType { //站点id private String id; //子级集合 private List< ...
- java遍历多层map_Java遍历Map对象的四种方式
文章转自: https://www.cnblogs.com/fqfanqi/p/6187085.html 关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况 ...
最新文章
- 英伟达十年力作:新一代光线追踪显卡 Quadro RTX及核心架构Turing,可支持AI运算...
- LeetCode-笔记-45.跳跃游戏II-贪心算法
- 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
- PHP性能调优---php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
- gearman php mysql_php使用gearman
- centos7配置haproxy
- Spring依赖注入:注解注入总结
- OAuth 2.0 的探险之旅
- 地理知识归纳:影响降水的九大因素
- 算法高级(41)-推荐算法实现
- mysql 数字序列_MySQL中的数字序列
- 二叉查找(排序)树/二叉树----建树,遍历
- 字符串转HTML段落
- Java工程师需要掌握哪些知识和专业技能呢?
- Deepfacelab 新手教程【AI智能换脸】
- kali使用笔记本自带无线网卡_(小杨推荐)电脑无线上网+蓝牙解决方案
- Maya vray 3S皮肤材质球设置与材质节点连接
- EM算法在直线分类与灭点检测中的应用(关于一篇文章的读后感)
- 差异性分析该如何选择?
- 如何将Chrome设为iPhone和iPad上的默认Web浏览器