Android - 如何使用 Retrofit SimpleXML 解析 xml?
Android - how to use parse xml using Retrofit SimpleXML?
我刚开始使用 Retrofit。我正在开发一个使用 SimpleXML 的项目。我正在尝试从站点 http://www.supermarketapi.com 获取 XML 但出现以下错误:
java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable<com.crosser.brian.shakennotstirred.Models.StoreResultModel> for method SupermarketProvider.getStoreSearchResults
我正在尝试获取的 xml 看起来像:
http://www.supermarketapi.com/api.asmx/StoresByZip
下面我提供了我的项目的摘录。不确定我做错了什么。
StoreResultModel 文件:
public class StoreResultModel {
@Root(name = "ArrayOfStore")
ArrayList<StoreModel> searchStoresResults;
public ArrayList<StoreModel> getSearchStoresResults(){
return searchStoresResults;
}
}
商店模型文件:
@Root(name = "Store")
public class StoreModel {
@Element(name ="Storename")
public String storename;
@Element(name ="Address")
public String address;
@Element(name ="City")
public String city;
@Element(name ="State")
public String state;
@Element(name ="Zip")
public String zip;
@Element(name ="Phone")
public String phone;
@Element(name ="StoreId")
public int storeId;
public int getStoreId() {
return storeId;
}
public String getStorename(){
return storename;
}
public String getAddress(){
return address;
}
public String getCity(){
return city;
}
public String getState(){ return state; }
public String getZip() { return zip; }
public String getPhone() { return phone; }
public void setStoreId(int storeID) { this.storeId = storeId; }
public void setStorename(String storename) { this.storename = storename; }
public void setAddress(String address) { this.address = address; }
public void setCity(String city) { this.city = city; }
public void setState(String state) { this.state = state; }
public void setZip(String zip) { this.zip = zip; }
public void setPhone(String phone) {
this.phone = phone;
}
}
超市API客户档案:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppDefines.SUPERMARKET_API_URL)
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
我的 API 电话:
SupermarketAPIClient.getSupermarketProvider()
.getStoreSearchResults(AppDefines.SUPERMARKET_API_KEY, ZipCode)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<StoreResultModel>() {
SupermarketProvider 文件:
@GET("/api.asmx/StoresByZip")
Observable<StoreResultModel> getStoreSearchResults(@Query("APIKEY") String key,
@Query("ZipCode") String zip);
AppDefines 文件:
public static final String SUPERMARKET_API_URL = "http://www.SupermarketAPI.com";
public static final String SUPERMARKET_API_KEY = "**********";
提前致谢!
将此添加到您的 build.gradle
(在 dependencies
下):
compile "com.squareup.retrofit:adapter-rxjava:$project.retrofitVersion"
(将 $project.retrofitVersion
替换为您正在使用的版本,大概是 2.0.0-beta1 或 2.0.0-beta2)。
并为您添加此行 Retrofit.Builder
:
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
如果我没记错的话,你的错误与 XML 无关,但事实上 Retrofit 2 现在需要 RxJava 适配器才能 return Observable
s共 Call
秒。
我刚开始使用 Retrofit。我正在开发一个使用 SimpleXML 的项目。我正在尝试从站点 http://www.supermarketapi.com 获取 XML 但出现以下错误:
java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable<com.crosser.brian.shakennotstirred.Models.StoreResultModel> for method SupermarketProvider.getStoreSearchResults
我正在尝试获取的 xml 看起来像: http://www.supermarketapi.com/api.asmx/StoresByZip
下面我提供了我的项目的摘录。不确定我做错了什么。
StoreResultModel 文件:
public class StoreResultModel {
@Root(name = "ArrayOfStore")
ArrayList<StoreModel> searchStoresResults;
public ArrayList<StoreModel> getSearchStoresResults(){
return searchStoresResults;
}
}
商店模型文件:
@Root(name = "Store")
public class StoreModel {
@Element(name ="Storename")
public String storename;
@Element(name ="Address")
public String address;
@Element(name ="City")
public String city;
@Element(name ="State")
public String state;
@Element(name ="Zip")
public String zip;
@Element(name ="Phone")
public String phone;
@Element(name ="StoreId")
public int storeId;
public int getStoreId() {
return storeId;
}
public String getStorename(){
return storename;
}
public String getAddress(){
return address;
}
public String getCity(){
return city;
}
public String getState(){ return state; }
public String getZip() { return zip; }
public String getPhone() { return phone; }
public void setStoreId(int storeID) { this.storeId = storeId; }
public void setStorename(String storename) { this.storename = storename; }
public void setAddress(String address) { this.address = address; }
public void setCity(String city) { this.city = city; }
public void setState(String state) { this.state = state; }
public void setZip(String zip) { this.zip = zip; }
public void setPhone(String phone) {
this.phone = phone;
}
}
超市API客户档案:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppDefines.SUPERMARKET_API_URL)
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
我的 API 电话:
SupermarketAPIClient.getSupermarketProvider()
.getStoreSearchResults(AppDefines.SUPERMARKET_API_KEY, ZipCode)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<StoreResultModel>() {
SupermarketProvider 文件:
@GET("/api.asmx/StoresByZip")
Observable<StoreResultModel> getStoreSearchResults(@Query("APIKEY") String key,
@Query("ZipCode") String zip);
AppDefines 文件:
public static final String SUPERMARKET_API_URL = "http://www.SupermarketAPI.com";
public static final String SUPERMARKET_API_KEY = "**********";
提前致谢!
将此添加到您的 build.gradle
(在 dependencies
下):
compile "com.squareup.retrofit:adapter-rxjava:$project.retrofitVersion"
(将 $project.retrofitVersion
替换为您正在使用的版本,大概是 2.0.0-beta1 或 2.0.0-beta2)。
并为您添加此行 Retrofit.Builder
:
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
如果我没记错的话,你的错误与 XML 无关,但事实上 Retrofit 2 现在需要 RxJava 适配器才能 return Observable
s共 Call
秒。