Я пытаюсь проанализировать данные из SOAP API с помощью retrofit2 в моем приложении для Android. Но проблема в том, что данные не анализируются, поскольку в процессе анализа не идентифицируются теги, так как они включены в ответ как значение другого тега в виде простого текста.
Я создал соответствующие классы моделей и правильно аннотировал, но синтаксический анализ до сих пор не происходит. Пожалуйста, найдите WSDL конверта ответа ниже
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<MyResponse xmlns="http://www.mywebserver.com/Webserver/">
<MyResult>string</MyResult>
</MyResponse>
</soap12:Body>
</soap12:Envelope>
Внутри тега MyResult я ожидал весь результат в форме XML, но, поскольку WSDL показывает данные XML, поступающие в виде ' String ', следовательно, анализатор может определить теги, присутствующие внутри тега MyResult .
Я использовал следующие зависимости в своем проекте.
implementation "com.squareup.retrofit2:retrofit:2.6.0"
implementation ('com.squareup.retrofit2:converter-simplexml:2.1.0'){
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
exclude group: 'xpp3', module: 'xpp3'
}
И моя инициализация экземпляра модификации:
object RetrofitInstance {
val retrofit: Retrofit by lazy {
val startergy = AnnotationStrategy()
val serializer = Persister(startergy)
val gson = GsonBuilder().setLenient().create()
val okHttpClient = OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build()
Retrofit.Builder()
.baseUrl("https://www.mywebserveraddress.com")
.client(okHttpClient)
.addConverterFactory(SimpleXmlConverterFactory.create(serializer))
.build()
}}
Заранее спасибо.
Добавление классов моделей для дальнейшего использования
@Root(name = "soapenv:Envelope")
@NamespaceList({
@Namespace(reference = "http://www.w3.org/2003/05/soap-envelope", prefix = "xsi"),
@Namespace(reference = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi"),
@Namespace(reference = "http://www.w3.org/2001/XMLSchema", prefix = "xsd")
})
public class ResponseEnvelope {
@Element(name = "Body")
private Body body;
}
@Root(name = "Body", strict = false)
public class Body {
@Element(name = "GetDynamicReportsResponse")
GetDynamicReportsResponse getDynamicReportsResponse;
}
@Root(name = "GetDynamicReportsResponse")
@Namespace(reference = "http://www.server.com/MobileWebServer/")
class GetDynamicReportsResponse {
@Element(name = "GetDynamicReportsResult")
GetDynamicReportsResult getDynamicReportsResult;
}
@Root(name = "GetDynamicReportsResult" , strict = false)
class GetDynamicReportsResult {
@Element(name = "reports", required = false)
Reports reports;
}
@Root(name = "reports", strict = false)
public class Reports {
@ElementList(name = "report", required = false)
ArrayList<Report> reports;
}
@Root(name = "report", strict = false)
public class Report {
@Element(name = "serviceName", required = false)
public String serviceName;
@Element(name = "name" , required = false)
public String name;
@ElementList(name = "sections" , required = false)
public List<Section> sections;
@Element(name = "IsPropertyChecked" , required = false)
public String isPropertyChecked;
@Element(name = "CheckElementId" , required = false)
public String checkElementId;
@Element(name = "DynamicReportCheckCycleId" , required = false)
public String dynamicReportCheckCycleId;
@Element(name = "CheckOptional" , required = false)
public String checkOptional;
@Attribute(name = "id" , required = false)
public String id;
@Attribute(name = "mandatory" , required = false)
public String mandatory;
@Attribute(name = "serviceId" , required = false)
public String serviceId;
}
@Root(name = "section", strict = false)
public class Section {
@Element(name = "label" , required = false)
public String label;
@Element(name = "questions" , required = false)
public List<Question> questions;
@Attribute(name = "id" , required = false)
public String id;
}
@Root(name = "question", strict = false)
public class Question {
@Element(name = "label" , required = false)
public String label;
@Element(name = "dataType" , required = false)
public DataType dataType;
@Element(name = "mandatory" , required = false)
public String mandatory;
@Element(name = "followUpInputStyle" , required = false)
public FollowUpInputStyle followUpInputStyle;
@Element(name = "checkElementId" , required = false)
public String checkElementId;
@Element(name = "visitOutcomeId" , required = false)
public String visitOutcomeId;
@Attribute(name = "id" , required = false)
public String id;
@Attribute(name = "followUpInput" , required = false)
public String followUpInput;
}
@Root(name = "dataType",strict = false)
public class DataType {
@ElementList(name = "options" , required = false)
public List<Option> options;
@Attribute(name = "id" , required = false)
public String id;
@Attribute(name = "name" , required = false)
public String name;
@Attribute(name = "type" , required = false)
public String type;
@Attribute(name = "minRange" , required = false)
public String minRange;
@Attribute(name = "maxRange" , required = false)
public String maxRange;
}
@Root(name = "option", strict = false)
public class Option {
@Element(name = "value" )
public String value;
@Element(name = "visitOutComeId")
public VisitOutComeId visitOutComeId;
@Element(name = "id")
public String id;
}
@Root(name = "visitOutComeId", strict = false)
public class VisitOutComeId {
@Element(name = "xmlns:p10")
public String xmlnsP10;
@Element(name = "p10:nil")
public String p10Nil;
}