递归解析xml报文里的数据并返回Map,节点下有多条数据自动生成List。

递归解析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;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值