上一篇中说到封装了HttpClient助手类和Json解析响应数据的封装。这节主要扩展响应数据解析类,封装出一个xml解析的实现类,适应微信第三方服务的接口。
主要实现的效果,把xml格式的数据转成map集合的格式,里面可能包含一个map集合,也可能包含一个List集合。甚至会对xml中的标签内属性进行封装,加上attr_前缀进行保存。比如如下格式的xml数据:
<?xml version="1.0" encoding="utf-8"?>
<!-- Edited by XMLSpy -->
<bookstore key="11111">
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author id="1">James McGovern</author>
<author id="1">Per Bothner</author>
<author id="1">Kurt Cagle</author>
<author id="1">James Linn</author>
<author id="1">Vaidyanathan Nagarajan</author>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
</book>
<a category="web" cover="paperback">abc</a>
<v category="web" cover="paperback">abc
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
</v>
</bookstore>
应该解释成map之后,转成json格式是如下的,才比较方便操作(这里有一些细节需要说明一下:如果标签中不在含有子标签,那么需要转成map集合的形式,值得key使用value,然后属性还是attr_前缀):
{
"bookstore": {
"a": {
"attr_cover": "paperback",
"value": "abc",
"attr_category": "web"
},
"v": {
"attr_cover": "paperback",
"author": {
"value": "Erik T. Ray"
},
"title": {
"attr_lang": "en",
"value": "Learning XML"
},
"attr_category": "web"
},
"book": [
{
"author": {
"value": "Giada De Laurentiis"
},
"title": {
"attr_lang": "en",
"value": "Everyday Italian"
},
"attr_category": "cooking"
},
{
"author": {
"value": "J K. Rowling"
},
"title": {
"attr_lang": "en",
"value": "Harry Potter"
},
"attr_category": "children"
},
{
"author": [
{
"value": "James McGovern",
"attr_id": "1"
},
{
"value": "Per Bothner",
"attr_id": "1"
},
{
"value": "Kurt Cagle",
"attr_id": "1"
},
{
"value": "James Linn",
"attr_id": "1"
},
{
"value": "Vaidyanathan Nagarajan",
"attr_id": "1"
}
],
"title": {
"attr_lang": "en",
"value": "XQuery Kick Start"
},
"attr_category": "web"
},
{
"attr_cover": "paperback",
"author": {
"value": "Erik T. Ray"
},
"title": {
"attr_lang": "en",
"value": "Learning XML"
},
"attr_category": "web"
}
],
"attr_key": "11111"
}
}
主要的实现类在github中给出:
有了这个类之后,就可以在HttpClient中使用这个类来解析响应请求了,使用方法也很简单:
Map<String, Object> res = HttpClientHelper.postRawData("http://192.168.100.244:18081/accessService" , reqParams, new XmlResponseParser());
如果使用过android的Volley框架,你会发现其实他也是这样封装的,需要解析不同的数据也是要实现一个接口,只不过Volley是异步的