xml递归解析成Map

来源:互联网 发布:java写接口供别人调用 编辑:程序博客网 时间:2024/06/06 05:48

实用场景

在做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也是如此
/** * 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 每个节点存当前节点所对应的所有子节点 ---核心思想Imap.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) {//如果还有  则递归 思想Im = getText(el, m);} else {m.put(el.getName(), el.getText());}//把子节点所对应的map 返回给父节点mapA.putAll(m);}return map;}

OK 大功告成


原创粉丝点击