xml递归解析成Map

实用场景

在做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 每个节点存当前节点所对应的所有子节点 ---核心思想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 大功告成


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值