利用 dom4j 把 xml 字符串转成 Map 对象
开发过程中遇到过个需求,自己动手写一个,分享一下。
-
程序的入口方法
/** * [@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; }
-
自定义 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; }
-
自定义 putMap(Map<String, Object> map, String key, Object obj) 方法
是一个 void 方法,负责把子结点的值(可能是普通值,也可能是 Map 对象)put 到 map 对象里,此处要考虑的情况有3种:
-
map中不包含key - 直接put;
-
map中包含key,类型为List - add到list里,然后put;
-
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; }
-
程序到这里就结束了,有伙伴觉得哪里不爽,欢迎反馈。