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 Observables共 Call 秒。