上一篇文章大概介绍了一下RxJava+Retrofit2解析JSON数据的方法,现在来解析XML,首先,先贴一个网络连接地址,博主也是参考上面的:
http://blog.csdn.net/qqyanjiang/article/details/51199111
XML数据与上一篇的一样,只是格式不同
//XML数据网络地址
http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni
第一步:添加依赖
compile ('com.squareup.retrofit2:converter-simplexml:2.0.1'){
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax' }
全部复制,缺一不可
第二步:创建接口DataServce
interface NewsApi{
@GET("service/publicXMLFeed")
Observable<NewsDataXml> getNewsData(
@Query("command") String id,
@Query("a") String datePre
);
}
第三步:创建model,这里与解析JSON时有一定差距的
@Root(name = "body", strict = false) //name:要解析的xml数据的头部
public class NewsDataXml {
@Attribute
public String copyright; //属性
@ElementList(required = true, inline = true, entry = "route") //标志是集合
public List<NewsXml> newsXmls = new ArrayList<>();
}
@Root(name = "route", strict = false) //要解析的xml数据的头部
public class NewsXml {
@Attribute
public String tag;
@Attribute
public String title;
}
这里需要注意的一下是,经我测试,这里如果写成内部类会导致xml数据解析失败
第四步:实现网络请求,解析XML数据
private String basUrl="http://webservices.nextbus.com/";
NewsApi newsApi = new Retrofit.Builder().baseUrl(basUrl)
.addConverterFactory(SimpleXmlConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
.create(NewsApi.class);
newsApi .getNewsData("routeList", "sf-muni")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<NewsDataXml, Observable<NewsXml>>() {
@Override
public Observable<NewsXml> call(NewsDataXml newsDataXml) {
return Observable.from(newsDataXml.newsXmls);
}
}).subscribe(new Subscriber<NewsXml>() {
@Override
public void onCompleted() {
Log.v("xmlidea", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.v("xmlidea", "onError" + e.toString());
}
@Override
public void onNext(NewsXml newsXml) {
Log.v("xmlidea", newsXml.title);
Log.v("xmlidea", newsXml.tag);
}
});
}
OK,简单的JSON和XML数据解析都已搞定,只要理解了,即使数据再复杂一些,我相信也是没问题的,最后提一下,RxJava+Retrofit2配合MVP或者MVVM的框架使用效果会更好