最近在做国际客服北京职场的项目,需要提供一个接口服务端的能力,也就是需要开发一个http+xml的协议,入参和出参均为Map格式,各系统间的请求或应答是以xml格式封装的。在将返回报文(xml)解析为Map输出时遇到一个难点:Java对于多层级xml的解析。现以一个客户资料查询接口为例将解析过程记录如下:
返回xml报文的简化形式:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HEAD>
<ORIGIN_DOMAIN>kefuxitongbianma</ORIGIN_DOMAIN>
<HOME_DOMAIN>CUGCRM</HOME_DOMAIN>
<ACTION_CODE>1</ACTION_CODE>
<BUSI_CODE>QUERYCUST</BUSI_CODE>
<TRANS_ID>20160220160635123456</TRANS_ID>
<RET_CODE>0000</RET_CODE>
<RET_MSG>success</RET_MSG>
</HEAD>
<BODY>
<TOTAL_RECORDS>20</TOTAL_RECORDS>
<TOTAL_PAGE>10</TOTAL_PAGE>
<CURRENT_PAGE>1</CURRENT_PAGE>
<CUSTINFOLIST>
<CUSTINFO>
<CUST_TYPE>001</CUST_TYPE>
<VIP_FLAG>true</VIP_FLAG>
</CUSTINFO>
<CUSTINFO>
<CUST_TYPE>002</CUST_TYPE>
<VIP_FLAG>false</VIP_FLAG>
</CUSTINFO>
<CUSTINFO>
<CUST_TYPE>003</CUST_TYPE>
<VIP_FLAG>false</VIP_FLAG>
</CUSTINFO>
</CUSTINFOLIST>
</BODY>
</ROOT>
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
/**
* 解析xml的工具类
* 1、将多层级xml解析为Map
* 2、将多层级xml解析为Json
*
* @author lmb
*
*/
public class ParseXmlUtil {
public static Logger logger = Logger.getLogger(ParseXmlUtil.class);
public static void main(String[] args) {
// 获取一个xml文件
String textFromFile = MyXmlUtil.XmlToString();
//将xml解析为Map