Как разобрать этот ответ XML SOAP на POJO? - PullRequest
0 голосов
/ 08 мая 2019

У меня проблема с преобразованием возврата XML SOAP в соответствующий класс POJO.Возврат XML выглядит следующим образом:

    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Header></env:Header>
    <env:Body>
        <ns2:teste xmlns:ns2="http://teste.com.br/">
            <retorno>
                <codigoRetorno>000</codigoRetorno>
                <descricao>Consulta Realizada com Sucesso</descricao>
                <item>
                    <a>teste</a>
                    <b>teste</b>
                    <c>teste</c>
                </item>
                <item>
                    <a>teste</a>
                    <b>teste</b>
                    <c>teste</c>
                </item>
            </retorno>
        </ns2:teste >
    </env:Body>
</env:Envelope>

Я попытался использовать XMLsonpper Jackson XML, но не могу заставить его рассматривать узел RETURN в качестве элемента ROOT во время десериализации.он рассматривает узел 'Envelope' как узел ROOT.

Мне нужно извлечь только возвращаемый узел и преобразовать его в мой класс pojo.

Другая проблема заключается в том, что узлы 'item' должны быть частьюколлекция, однако нет родительского узла, группирующего эти элементы.

Кто-нибудь знает о парсере, который выполняет десериализацию этого типа XML?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Самым чистым решением, которое я нашел, было использование JSOUP:

private <T> T parseResponse(HttpEntity entity, Class<T> typeTarget) throws Exception {

       try {

           String xmlSoapResponse = EntityUtils.toString(entity, StandardCharsets.UTF_8);
           String xmlRetorno = extractXmlElement(xmlSoapResponse, "retorno");

           XmlMapper xmlMapper = new XmlMapper();
           xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
           xmlMapper.registerModule(new JavaTimeModule());
           return xmlMapper.readValue(xmlRetorno.toString(), typeTarget);

       } catch (Exception e) {
           throw new Exception("Fail during parser", e);
       }

   }
private String extractXmlElement(String xmlString, String nodeTagNameElement) {

        Document document = Jsoup.parse(xmlString, "", Parser.xmlParser());
        document.outputSettings().prettyPrint(false);
        Elements retorno = document.getElementsByTag(nodeTagNameElement);

        return retorno.toString();

    }
0 голосов
/ 08 мая 2019

Вы можете включить потоковый анализатор XML (StAX) и XmlMapper следующим образом:

import java.io.StringReader;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class Deser {
    // @formatter:off

    private static final String JSON = "    <env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + 
            "    <env:Header></env:Header>\n" + 
            "    <env:Body>\n" + 
            "        <ns2:teste xmlns:ns2=\"http://teste.com.br/\">\n" + 
            "            <retorno>\n" + 
            "                <codigoRetorno>000</codigoRetorno>\n" + 
            "                <descricao>Consulta Realizada com Sucesso</descricao>\n" + 
            "                <item>\n" + 
            "                    <a>teste</a>\n" + 
            "                    <b>teste</b>\n" + 
            "                    <c>teste</c>\n" + 
            "                </item>\n" + 
            "                <item>\n" + 
            "                    <a>teste</a>\n" + 
            "                    <b>teste</b>\n" + 
            "                    <c>teste</c>\n" + 
            "                </item>\n" + 
            "            </retorno>\n" + 
            "        </ns2:teste >\n" + 
            "    </env:Body>\n" + 
            "</env:Envelope>";

    // @formatter:on

    private static final String TARGET_ELEMENT = "retorno";

    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        XMLInputFactory f = XMLInputFactory.newFactory();
        XMLStreamReader sr = f.createXMLStreamReader(new StringReader(JSON));

        while (sr.hasNext()) {
            int type = sr.next();

            if (type == XMLStreamReader.START_ELEMENT && TARGET_ELEMENT.equals(sr.getLocalName())) {
                Retorno r = xmlMapper.readValue(sr, Retorno.class);

                System.out.println(r.getDescricao());
            }
        }
    }
}

class Retorno {
    private int codigoRetorno;
    private String descricao;

    public int getCodigoRetorno() {
        return codigoRetorno;
    }

    public void setCodigoRetorno(int codigoRetorno) {
        this.codigoRetorno = codigoRetorno;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}

Это дает:

Consulta Realizada com Sucesso

Адаптируйте код по мере необходимости, это просто, чтобы доказать, как заставить его делать то, что вам нужно!

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