簡體   English   中英

如何使用改造 2.0 解析 XML 響應?

[英]how to parse XML response using retrofit 2.0?

您好,我是 android 編程的新手,我已經瀏覽了一些關於如何使用改造解析 XML 響應的鏈接,我嘗試了如下所示的 XML。

我必須在 POJO 課程中進行任何必要的更改。 但在 Logcat 中出現 NullPointer 異常。 當我試圖閱讀響應時。

任何人都可以查看它並幫助我。

這是我對登錄 API 的 XML 響應。

[xml_response[1]

這是我的 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;
                        }
                    }
                }
            }
        }
    }
}

}

例如,您有一個 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構建器:

.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 的文件相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM