如何解析xml报文获取数据集合

场景:最近业务上需要处理xml的返回结果,由于处理的xml是一棵比较深的树,我们需要解析到底层进行数据收集

 1、引入依赖

  <!--  解析xml方法-->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>1.4.01</version>
        </dependency>

2、xml文件不要美化加空格换行这些,直接将返回的xml进行解析,如以下代码所示

public class SoapXmlParse {

    public static void main(String[] args) throws DocumentException {
        String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:impl=\"http://impl.webservcice.eis.com/\"><soapenv:Header><impl:Route><SerialNO>2022061304011132713</SerialNO><ServiceID>03102000000613</ServiceID><ServiceTime>20220613132713</ServiceTime><SourceSysID>04011</SourceSysID><ServiceResponse><Status>COMPLETE</Status></ServiceResponse></impl:Route></soapenv:Header><soapenv:Body><impl:EsbServiceResponse><ET_OUT p_type=\"G\" loop_num=\"1\"><NAME1>浙江星全汽车服务有限公司</NAME1><KUNNR>D00200102</KUNNR><BANKN/><KOINH/><BANKL/><BANKA/><ORT01/><ZSSYH/><ZYHMC/><BUKRS>9110</BUKRS><ZZHLX/><STATUS>I</STATUS><TEXTVALUE1/><TEXTVALUE2/><TEXTVALUE3/></ET_OUT><ET_OUT p_type=\"G\" loop_num=\"98\"><NAME1>天津中远河西店</NAME1><KUNNR>D22070302</KUNNR><BANKN/><KOINH/><BANKL/><BANKA/><ORT01/><ZSSYH/><ZYHMC/><BUKRS>9110</BUKRS><ZZHLX/><STATUS>I</STATUS><TEXTVALUE1/><TEXTVALUE2/><TEXTVALUE3/></ET_OUT></impl:EsbServiceResponse> </soapenv:Body></soapenv:Envelope>";

        Map map = new HashMap();
        List<ReceiveDealerInfoDto> dataList = new ArrayList<>();
        Document doc = DocumentHelper.parseText(soap);
        //获取根元素,准备递归解析这个XML树
        Element root = doc.getRootElement();
        //获取到data的集合
        List<Element> mzList = root.element("Body").element("EsbServiceResponse").elements("ET_OUT");
        //遍历data集合
        for (Element e : mzList) {
            List<Element> elements = e.elements();
            //遍历将元素中的key和value存到map中
            for (Element item : elements) {
                if (!StringUtils.isEmpty(item.getText())) {
                    map.put(item.getName(), item.getText());
                }
            }
            //将map转换成对象
            ReceiveDealerInfoDto data = BeanUtil.mapToBean(map, ReceiveDealerInfoDto.class, true);
            //对象存到集合中
            dataList.add(data);
        }
        System.out.println(dataList);
        //最后可以将取到的数据返回及其他等等操作
    }
}

 注意:最后面的根节点用elements,父节点用element:

List<Element> mzList ==root.element("Body").element("EsbServiceResponse").elements("ET_OUT");
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值