【问题标题】:how to parse XML response using retrofit 2.0?如何使用改造 2.0 解析 XML 响应?
【发布时间】:2019-03-27 11:07:47
【问题描述】:

您好,我是 android 编程新手,我已经浏览了一些关于如何使用改造来解析 XML 响应的链接,我尝试了下面的 XML,如图所示。

我必须在 POJO 类中做任何必要的更改吗?但在 Logcat 中出现 NullPointer 异常。当我试图阅读响应时。

谁能帮帮我看看。

这是我对登录 API 的 XML 响应。

[

这是我的 MainActivity 代码。任何人都可以建议哪里出错了。

RequestBody requestBody = RequestBody.create(MediaType.parse("text/xml"), strRequestBody);

    Call<LoginResponseEnvelope> call = RetrofitGenerator.getProductInterfaceApi().Login(requestBody);
    call.enqueue(new Callback<LoginResponseEnvelope>() {
        @Override
        public void onResponse(Call<LoginResponseEnvelope> call, Response<LoginResponseEnvelope> response) {
            progressbar.setVisibility(View.GONE);

            if (response != null) {
                try {
                    Log.d("LoginResponse", "success response :" + response.body());
                    LoginResponseEnvelope loginResponseEnvelope = response.body();
                } catch (Exception e) {
                    e.printStackTrace();
                }

               /* if (loginResponseEnvelope != null) {
                    Log.d("LoginResponse", "success loginResponseEnvelope :" + loginResponseEnvelope.toString());

                    String status = loginResponseEnvelope.getBody().getLoginResponseData().getLoginResult().getLoginInfo().toString();

                    Intent intent = new Intent(MainActivity.this, SuccessActivity.class);
                    startActivity(intent);
                }*/
            }

            /*if (loginResponseEnvelope!=null){

            }*/
        }

        @Override
        public void onFailure(Call<LoginResponseEnvelope> call, Throwable t) {
            progressbar.setVisibility(View.GONE);
            Log.d("LoginResponse", "failure response :" + t.getMessage());
        }
    });

这是我为 XML 响应改造的 POJO 类。

public class LoginResponseEnvelope {

@Element(name = "Body", required = false)
private LoginResponseBody body;

public LoginResponseBody getBody() {
    return body;
}

public void setBody(LoginResponseBody body) {
    this.body = body;
}

@Override
public String toString() {
    return "LoginResponseEnvelope{" +
            "body=" + body +
            '}';
}

@Root(name = "Body", strict = false)
public class LoginResponseBody {

    @Element(name = "LoginResponse", required = false)
    private LoginResponseData loginResponseData;

    public LoginResponseData getLoginResponseData() {
        return loginResponseData;
    }

    public void setLoginResponseData(LoginResponseData loginResponseData) {
        this.loginResponseData = loginResponseData;
    }

    @Root(name = "LoginResponse", strict = false)
    @Namespace(reference = "http://tempuri.org/")
    public class LoginResponseData {

        @Element(name = "LoginResult", required = false)
        private LoginResult loginResult;

        public LoginResult getLoginResult() {
            return loginResult;
        }

        public void setLoginResult(LoginResult loginResult) {
            this.loginResult = loginResult;
        }

        @Root(name = "LoginResult", strict = false)
        public class LoginResult {

            @Element(name = "Result", required = false)
            private LoginInfo loginInfo;

            public LoginInfo getLoginInfo() {
                return loginInfo;
            }

            public void setLoginInfo(LoginInfo loginInfo) {
                this.loginInfo = loginInfo;
            }

            @Root(name = "Result", strict = false)
            @Namespace(reference = "")
            public class LoginInfo {

                @Element(name = "Success", required = false)
                private Success success;

                public Success getSuccess() {
                    return success;
                }

                public void setSuccess(Success success) {
                    this.success = success;
                }

                @Root(name = "Success", strict = false)
                public class Success {

                    @ElementList(name = "CompanyDetails", inline = true)
                    private List<Company> companyDetails;

                    public List<Company> getCompanyDetails() {
                        return companyDetails;
                    }

                    public void setCompanyDetails(List<Company> companyDetails) {
                        this.companyDetails = companyDetails;
                    }

                    @Root(name = "CompanyDetails", strict = false)
                    public class Company {

                        @Element(name = "Id", required = false)
                        private String id;

                        @Element(name = "Name", required = false)
                        private String Name;

                        public String getId() {
                            return id;
                        }

                        public void setId(String id) {
                            this.id = id;
                        }

                        public String getName() {
                            return Name;
                        }

                        public void setName(String name) {
                            Name = name;
                        }
                    }
                }
            }
        }
    }
}

}

【问题讨论】:

    标签: android xml-parsing retrofit


    【解决方案1】:

    例如你有一个 XML 字符串:

    <Response>
        <Field1>string</Field1>
        <Field2>string</Field2>
        <Field3>string</Field3>
        <Field4>string</Field4>
    </Response>
    

    首先,添加到您的gradle 文件中:

    implementation "com.squareup.retrofit2:converter-simplexml:2.6.1" 
    

    接下来,添加到您的retrofit builder:

    .addConverterFactory(SimpleXmlConverterFactory.create())
    

    注意:SimpleXmlConverterFactory 现在已弃用,但我还没有找到更好的解决方案

    还有你的模型类:

    @Root(name = "Response")
    data class Response @JvmOverloads constructor(
    @field:Element(name = "Field1")
    var bucket: String = "",
    @field:Element(name = "Field2")
    var key: String = "",
    @field:Element(name = "Field3")
    var etag: String = "",
    @field:Element(name = "Field4")
    var location: String = ""
    )
    

    注意:属性需要预定义

    您的 ApiService 文件将与您解析 json 的文件相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多