上一篇文章大概介绍了一下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'){
excludegroup:'xpp3',
module:'xpp3'
excludegroup:'stax',
module:'stax-api'
excludegroup:'stax',
module:'stax'}
全部复制,缺一不可
第二步:创建接口DataServce
interface NewsApi{
@GET("service/publicXMLFeed")
Observable 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 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>() {
@Override
public Observable call(NewsDataXml newsDataXml) {
return Observable.from(newsDataXml.newsXmls);
}
}).subscribe(new Subscriber() {
@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);
}
});
}