递归解析xml报文里的数据并返回Map,用到了就把他记录下来了
package com.faker.app.util;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>Title: XML解析工具类 - XmlUtil</p>
*
* <p>Description:常用工具放这儿</p>
*
* <p>Copyright: Copyright Faker(c) 2019</p>
*
* <p>Company: faker</p>
*
* @author 淡梦如烟 2019-07-23
*
* @version 1.0
*/
public class XmlUtil {
/**
* 将报文转换为Map对象
* @param soap 报文
* @return Map 对象
* @throws DocumentException 文档异常
*/
public static Map<String, Object> parseXmlToMap(String soap) throws DocumentException {
// 报文转成doc对象
org.dom4j.Document doc = DocumentHelper.parseText(soap);
// 获取根元素,准备递归解析这个XML树
org.dom4j.Element root = doc.getRootElement();
Map<String, Object> map = getCode(root);
return map;
}
/**
* 获取子节点信息
* @param root 根文档
* @return Map对
*/
public static Map<String, Object> getCode(org.dom4j.Element root) {
Map<String, Object> map = new HashMap<String, Object>();
if (root.elements() != null) {
List<Element> list = root.elements();// 如果当前跟节点有子节点,找到子节点
for (org.dom4j.Element e : list) {// 遍历每个节点
if (e.elements().size() > 0) {
//如果Map里有数据,判断该节点这是一个List集合
if(null!=map.get(e.getName())){
String eleName = e.getName();
Object object = map.get(eleName);
if(object instanceof List){
//List就直接加入
List list3 = (List)(object);
//递归解析
list3.add(getCode(e));
map.put(eleName,list3);
}else if(object instanceof Map){
//Map就新new一个List加入
List<Map> list3 = new ArrayList<>();
//递归解析
list3.add((Map)object);
list3.add(getCode(e));
map.put(eleName,list3);
}
}else{
// 当前节点不为空的话,递归遍历子节点;
map.put(e.getName(),getCode(e));
}
}
// 如果为叶子节点,那么直接把名字和值放入map
else if (e.elements().size() == 0) {
//map.put(e.getName(), e.getTextTrim());
String eleName = e.getName();
String text = e.getTextTrim();
Object object = map.get(eleName);
if(object instanceof List){
//List就直接加入
List list3 = (List)(object);
list3.add(text);
map.put(eleName,list3);
}else if(object instanceof String){
//String就新new一个List加入
List list3 = new ArrayList<>();
list3.add(object);
list3.add(text);
map.put(eleName,list3);
}else{
map.put(eleName,text);
}
}
}
}
return map;
}