Модификация 2: синтаксический анализ данных XML, присутствующих внутри тега XML - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь проанализировать данные из 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;

}

1 Ответ

0 голосов
/ 02 июля 2019

Магия SimpleXML заключается в правильной аннотации вашего класса данных.Я много боролся с правильной настройкой.

Если бы вы могли предоставить используемый вами класс аннотированных данных, я постараюсь вам помочь.

Также обязательно ознакомьтесь с официальной документацией: в ней много примеров.и учебные пособия .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...