递归方式将多层级xml转成map
来源:互联网 发布:淘宝怎么邮箱注册 编辑:程序博客网 时间:2024/05/21 06:40
在工作当中,往往接收到第三方报文时,会遇到xml报文转map数据结构的需求,如果是xml报文只有一个层级的话,递归转换很方便,但是多层级的xml转map,怎么转呢?我再网上看到了许许多多的实例,觉得很多不能满足我逾期的效果,所以整理了一下自己的想法,记录一下。
一、场景:
多层级的xml报文如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
<name>张三</name>
<age>1</age>
<addrs>
<addr>
<prov>江苏</prov>
<contry>南京</contry>
</addr>
<addr>
<prov>江苏</prov>
<contry>淮安</contry>
</addr>
</addrs>
</xml>
想得到的结果:
{
addrs=[
{contry=南京, prov=江苏},
{contry=淮安, prov=江苏}
],
name=张三,
age=1
}
二、案例代码:
public class TEST {
public static void main(String[] args) {
String xmlstr = "";//xml报文
Map<String, Object> mapXml = xmltoMap(xmlstr);
System.out.println("------"+mapXml.toString());
}
/**
* xml转成map
* @param xmlstr xml报文
* @return
*/
public static Map<String, Object> xmltoMap(String xmlstr){
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlstr);
} catch (DocumentException e) {
//logger.error("parse text error : " + e);
}
Element rootElement = doc.getRootElement();
Map<String,Object> mapXml = new HashMap<String,Object>();
elementToMap(mapXml,rootElement);
return mapXml;
}
/**
* 遍历子节点
* @param map
* @param rootElement
*/
public static void elementToMap(Map<String, Object> map, Element rootElement){
//获得当前节点的子节点
List<Element> elements = rootElement.elements();
Map<String,Object> childMap = new HashMap<String,Object>();
//如果还存在子节点,就考虑list情况,继续递归
for (Element element : elements) {
List<Element> es = element.elements();
if(es.size()>0){
//获取当前节点下的子节点
ArrayList<Map> list = new ArrayList<Map>();
for(Element e:es){
elementChildToList(list,e);
}
map.put(element.getName(), list);
}else{
map.put(element.getName(),element.getText());
}
}
}
/**
* 递归子节点
* @param arrayList
* @param rootElement
*/
public static void elementChildToList(ArrayList<Map> arrayList, Element rootElement){
//获得当前节点的子节点
List<Element> elements = rootElement.elements();
if(elements.size()>0){
ArrayList<Map> list = new ArrayList<Map>();
Map<String,Object> sameTempMap = new HashMap<String,Object>();
for(Element element:elements){
elementChildToList(list,element);
sameTempMap.put(element.getName(), element.getText());
}
System.out.println(elements.size());
arrayList.add(sameTempMap);
}
}
}
我感觉我这种写法虽然能解决了问题,但是却有些笨拙,不知道各位有没有更好的,希望各位不吝赐教。
- 递归方式将多层级xml转成map
- Dom4jUtil工具类,用于将xml文件转成map
- 一个xStream详解 如何将XML转成Map 或者反转
- 将List转成树的两种方式(递归、循环)
- 将List转成树的两种方式(递归、循环)
- 关于利用cmarkup类将xml转成树的递归代码
- php将XML转成数组
- java将xml转成对象
- 非递归方式将Xml转hashmap对象
- 将String,json转成Map或bean
- Java 用反射将JavaBean转成Map
- 使用stream将list转成map
- 利用Scanner将string转成Map
- 用递归将十进制转成二进制
- 读取XML文件 并转成Map
- xml递归解析成Map
- 将JDBC结果集转成XML格式文件
- AS3将XML转成对象的类
- Android C++ Socket请求XMl,TinyXml解析文件,JNI返回数据给JAVA层
- DOM元素节点
- 【转】svn搭建与使用
- 算法导论第十一(11)章散列(Hash)表知识点梳理及详细课后答案
- wpa_cli P2P 连接相关调试命令
- 递归方式将多层级xml转成map
- 【漫画技术】Android跨进程通信
- mui------列表项中如何实现自动左滑或者右滑
- 博客搭建攻略(三):创造收益
- 配置Nginx时一定要小心(1)——目录拼写问题。
- angluarjs 复选框实现多选功能
- Alpha-Beta剪枝算法
- Eclipse Memory Analyzer 使用技巧
- Linux下C语言正则表达式使用详解