场景:最近业务上需要处理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");