实用场景
在做WebService传输交互的时候 我们基本采用SOAP 1.0以上协议,用XML作为服务开发传输约束。
问题产生
在我们接收和返回数据以及实际应用开发时候并不能直接在XML上进行关键字段的获取和处理。比如:
<?xml version='1.0' encoding='UTF-8'?>
<messages >
<heartbeat>0</heartbeat>
<switchset>
<authority>
<authoritytype>0</authoritytype>
<username/>
<userpwd/>
<license/>
</authority>
<visitor>
<sourceorgan>3301050000000000000000</sourceorgan>
<sourcedomain>3301000012</sourcedomain>
</visitor>
<serviceinf>
<servicecode>10050101 </servicecode>
</serviceinf>
<provider>
<targetorgan/>
<targetdomain/>
</provider>
<route/>
<process/>
</switchset>
<business>
<standardcode>REQ.E0104.0201.001</standardcode>
<requestset>
<reqcondition>
<condition>
<WS08_10_052_01>47024049833010512B1001</WS08_10_052_01>
<WS06_00_940_01>20160518</WS06_00_940_01>
<WS06_00_940_02>20160519</WS06_00_940_02>
</condition>
</reqcondition>
<reqpaging>1</reqpaging>
<reqpageindex>1</reqpageindex>
<reqpageset>5</reqpageset>
</requestset>
<datacompress>0</datacompress>
<daqtaskid/>
<businessdata> </businessdata>
</business>
<extendset/>
</messages>
这XML就是标准的按照总线ESB模式传输,里面包括很多业务规范字段。如果直接在上面进行截取的话代码会变得很乱,很不规范。由此我们能不能先把它转化为我们通熟易懂的Map<key,value> 形式呢?实战演练
为了方便理解,我们从简单的开始分析
<request> --------------------------------第一个map 的key值 ,以下的结构体都是Value
<body> ----------------------------第一个map的value中第一个Map中的kay 到</body>为止都是value
<jgid>330105104</jgid>-----第一个map的value中第一个Map中value中的 第一个map
<sqid>11327203</sqid>
<yllb>1</yllb>
<jclb>3</jclb>
<djbz>1</djbz>
<brxm>王</brxm>
</body>
<data> ------------------------------第一个map的value中第二个Map中的kay 到</data>为止都是value
<data1>A1</data1>----------第一个map的value中第二个Map中的value的第二个map
<data2>A2</data2>
<data3>A3</data3>
<data4>A4</data4>
</data>
</request>
很显然外面这个最大的Map是由递归生成 最大的Map 0 :key={"request",value={body,data}}
data1,data2...data4--->data; key="data" ,value={ data1={A1},data2={A2},data3={A3},data4={A4} }
body也是如此
body也是如此
/**
* xml字符串解析成map集合
*
* @param s
* @return
*/
public Map<String, Object> xmlParseMap(String s) {
Element root = null;
try {
//把Stirng XML格式型转为标准的Document类型
Document doc = DocumentHelper.parseText(s);
//获取根节点
root = doc.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}
//new HashMap<String, Object>() 在这个map下新建子节点的map储存
return getText(root, new HashMap<String, Object>());
}
/**
* xml 获取 Map
* @param e
* @param map
* @return
*/
private Map<String, Object> getText(Element e,
Map<String, Object> map) {
Map<String, Object> mapA = new HashMap<String, Object>();
//mapA 每个节点存当前节点所对应的所有子节点 ---核心思想I
map.put(e.getName(), mapA);
Iterator<Element> it = e.elementIterator();
while (it.hasNext()) {
Map<String, Object> m = new HashMap<String, Object>();
Element el = it.next();
if (el.elements().size() != 0) {
//如果还有 则递归 思想I
m = getText(el, m);
} else {
m.put(el.getName(), el.getText());
}
//把子节点所对应的map 返回给父节点
mapA.putAll(m);
}
return map;
}
OK 大功告成