利用 dom4j 把 xml 字符串转成 Map 对象

利用 dom4j 把 xml 字符串转成 Map 对象

开发过程中遇到过个需求,自己动手写一个,分享一下。

  1. 程序的入口方法

     /**
      * [@author](https://my.oschina.net/arthor) ChangJian
      * [@data](https://my.oschina.net/difrik) 2018年8月2日
      * [@param](https://my.oschina.net/u/2303379) xml
      * [@return](https://my.oschina.net/u/556800)
      */
     public static Map<String, Object> xmlToMap(String xml) {
     	//创建一个Map返回用
     	Map<String, Object> xmlMap = new HashMap<String, Object>();
     	//把xml转成Document对象
     	Document document;
     	try {
     		document = DocumentHelper.parseText(xml);
     	} catch (DocumentException e) {
     		e.printStackTrace();
     		return xmlMap;
     	}
     	//获取根结点
     	Element rootElement = document.getRootElement();
     	//调用了一个自定义方法,用来把Element对象转成Map对象
     	xmlMap = elementToMap(rootElement);
     	return xmlMap;
     }
    
  2. 自定义 elementToMap(Element) 方法

    因为一个 xml 可能包含很多个上下层级、各种情况的结点、结点嵌套,会遇到多次需要把element的需求,而且此处用了递归的思维,解决这个问题还是很愉快的。

     /**
      * [@author](https://my.oschina.net/arthor) ChangJian
      * @data 2018年8月2日
      * @param element 是有子结点的
      * @return
      */
     private static Map<String, Object> elementToMap(Element element) {
     	//定义一个Map返回用
     	Map<String, Object> eleMap = new HashMap<String, Object>();
     	//获取并遍历当前结点有子结点
     	@SuppressWarnings("unchecked")
     	List<Element> elements = element.elements();
     	for (Element subEle : elements) {
     		//如果子结点没有孙子结点
     		if (subEle.elements().size() == 0) {
     			//调用了一个自定义方法,因为往eleMap里put值的时候,要考虑多种情况
     			putMap(eleMap, subEle.getName(), subEle.getTextTrim());
     			continue;
     		}
     		//有孙子结点的时候递归调用当前方法
     		putMap(eleMap, subEle.getName(), elementToMap(subEle));
     	}
     	return eleMap;
     }
    
  3. 自定义 putMap(Map<String, Object> map, String key, Object obj) 方法

    是一个 void 方法,负责把子结点的值(可能是普通值,也可能是 Map 对象)put 到 map 对象里,此处要考虑的情况有3种:

    1. map中不包含key - 直接put;

    2. map中包含key,类型为List - add到list里,然后put;

    3. map中包含key,类型为不list - new List,然后把原来的value和刚传入的obj对象add进去,再put到map里。

       /**
        * @author ChangJian
        * @data 2018年8月2日
        * @param map
        * @param key
        * @param obj
        */
       @SuppressWarnings({ "unchecked", "rawtypes" })
       private static void putMap(Map<String, Object> map, String key, Object obj) {
       	Object value = map.get(key);
       	if (null == value) {
       		map.put(key, obj);
       		return;
       	}
       	if (value instanceof List) {
       		((List) value).add(obj);
       		map.put(key, value);
       		return;
       	}
       	List<Object> valueList = new ArrayList<>();
       	valueList.add(value);
       	valueList.add(obj);
       	map.put(key, valueList);
       	return;
       }
      

程序到这里就结束了,有伙伴觉得哪里不爽,欢迎反馈。

转载于:https://my.oschina.net/u/3251146/blog/1921451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值