如何在单个改造调用中解析不同的 xml 数据
how to parse different xml data in single retrofit call
我在我的应用程序中使用带有改进的简单xml转换器来解析来自 API 的 xml 响应。 API 的成功响应如下。
<Success>
<id>sf98hjf</id>
</Success>
错误响应如下。
<Error>
<message>No data found</message>
</Error>
我的模型class解析成功响应如下
@Root(name = "Success")
public class ResponseModel {
@Element
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
当我得到成功响应时,这很好用。但我也想解析错误响应以向用户显示错误消息。我怎样才能达到同样的效果。现在我遇到异常,因为结构不匹配。提前致谢。
我终于找到了解决问题的方法。我没有尝试使用 2 个不同的模型进行解析,而是拦截了响应并添加了一个公共根元素。然后将 Success 和 Error 节点设为可选。因此无论响应是成功还是错误,相同的模型都会解析它。代码如下。
public class XmlInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
ResponseBody body = response.body();
String wrappedBody = "<Response>" + body.string() + "</Response>";
return response.newBuilder()
.body(ResponseBody.create(body.contentType(), wrappedBody))
.build();
}
}
要解析响应的模型 class。
@Root(name = "Response")
public class UploadResponseModel {
@Element(required = false)
private UploadSuccessModel Success;
@Element(required = false)
private ErrorModel Error;
public UploadSuccessModel getSuccess() {
return Success;
}
public void setSuccess(UploadSuccessModel success) {
Success = success;
}
public ErrorModel getError() {
return Error;
}
public void setError(ErrorModel error) {
Error = error;
}
}
我在我的应用程序中使用带有改进的简单xml转换器来解析来自 API 的 xml 响应。 API 的成功响应如下。
<Success>
<id>sf98hjf</id>
</Success>
错误响应如下。
<Error>
<message>No data found</message>
</Error>
我的模型class解析成功响应如下
@Root(name = "Success")
public class ResponseModel {
@Element
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
当我得到成功响应时,这很好用。但我也想解析错误响应以向用户显示错误消息。我怎样才能达到同样的效果。现在我遇到异常,因为结构不匹配。提前致谢。
我终于找到了解决问题的方法。我没有尝试使用 2 个不同的模型进行解析,而是拦截了响应并添加了一个公共根元素。然后将 Success 和 Error 节点设为可选。因此无论响应是成功还是错误,相同的模型都会解析它。代码如下。
public class XmlInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
ResponseBody body = response.body();
String wrappedBody = "<Response>" + body.string() + "</Response>";
return response.newBuilder()
.body(ResponseBody.create(body.contentType(), wrappedBody))
.build();
}
}
要解析响应的模型 class。
@Root(name = "Response")
public class UploadResponseModel {
@Element(required = false)
private UploadSuccessModel Success;
@Element(required = false)
private ErrorModel Error;
public UploadSuccessModel getSuccess() {
return Success;
}
public void setSuccess(UploadSuccessModel success) {
Success = success;
}
public ErrorModel getError() {
return Error;
}
public void setError(ErrorModel error) {
Error = error;
}
}