RxJava+Retrofit2实现XML解析

上一篇文章大概介绍了一下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);

}

});

}

你可能感兴趣的:(RxJava+Retrofit2实现XML解析)