[英]how to parse XML response using retrofit 2.0?
您好,我是 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;
}
}
}
}
}
}
}
}
例如,您有一個 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.