如何使用改造 2.0 解析 XML 响应? [英] how to parse XML response using retrofit 2.0?

查看:44
本文介绍了如何使用改造 2.0 解析 XML 响应?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Hi am new to android programming i have gone through some links for how to parse the XML response using retrofit and i tried for below XML as shown.

我必须在 POJO 类中进行任何必要的更改.但在 Logcat 中出现 NullPointer 异常.当我尝试阅读回复时.

Is there any necessary changes i have to do in POJO class. but am getting NullPointer Exception in Logcat. when am trying to read the response.

任何人都可以查看并帮助我.

Can any one please look into it and help me out.

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

this is my XML response for Login API.

[

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

Here is my MainActivity code. can any one suggest where am getting wrong.

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 类.

this is my retrofit POJO class for XML response.

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

}

推荐答案

例如你有一个 XML 字符串:

For example you have an XML string:

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

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

First, add to your gradle file:

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

接下来,添加到您的 retrofit 构建器:

Next, add to your retrofit builder:

.addConverterFactory(SimpleXmlConverterFactory.create())

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

Note: SimpleXmlConverterFactory is deprecated now, but I've not found a better solution

还有你的模型类:

@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 = ""
)

注意:属性需要预先定义

Note: properties need to be predefined

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

Your ApiService file will be the same as you are parsing json

这篇关于如何使用改造 2.0 解析 XML 响应?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆