【问题标题】:Android - how to use parse xml using Retrofit SimpleXML?Android - 如何使用 Retrofit SimpleXML 解析 xml?
【发布时间】:2016-03-07 08:51:00
【问题描述】:

我刚开始使用 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;
  } 
}

StoreModel 文件:

@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;
    }


}

SuperMarketAPIClient 文件:

    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 = "**********";

提前致谢!

【问题讨论】:

    标签: android api xml-parsing retrofit rx-android


    【解决方案1】:

    将此添加到您的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 适配器才能返回 Observables 而不是 Calls。

    【讨论】:

    • 我的 build.grade @david.mihola 中已有该依赖项
    • 那么,您是否也将该行添加到您的Retrofit.Builder
    • 添加了这条线,它有帮助!谢谢!现在我收到错误:java.lang.RuntimeException: org.simpleframework.xml.core.ElementException: Element 'Store' does not have a match in class ...Models.StoreResultModel at line 3 @david.mihola跨度>
    • 太好了,不客气!这是一个完全不同的问题——这个问题实际上只与 simplexml 相关,而不是特别是 Retrofit。我建议为此打开一个新问题。但我的猜测是StoreResultModel 中的@Root 行应该在类名的前面——就像在StoreModel 中一样。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多