Как конвертировать XML с повторяющимся элементом в объект Java (JAXB) - PullRequest
3 голосов
/ 09 июля 2019

У меня проблема с преобразованием повторяющегося элемента XML в объект. Я получаю этот XML через веб-сервис SOAP. Это XML:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <consultaResponse xmlns="http://tempuri.org/">
         <consultaResult>
            <INFO-XML xmlns="">
               <SOLICITACAO>
                  <TIPO>PLACA</TIPO>
                  <DADO>BMW0171</DADO>
                  <NUMERO_RESPOSTA>YY07090942S6</NUMERO_RESPOSTA>
                  <TEMPO>0.150113</TEMPO>
                  <MENSAGEM>1</MENSAGEM>
                  <HORARIO>2019-07-09 09:42:29</HORARIO>
               </SOLICITACAO>
               <RESPOSTA>
                  <PLACA>BMW0171</PLACA>
                  <CHASSI>WBAA25A4RRAA00859</CHASSI>
                  <ANO>1994/1994</ANO>
                  <MARCA_MODELO>325IA SC4 REGINO</MARCA_MODELO>
                  <SITUACAO_CHASSI>NORMAL</SITUACAO_CHASSI>
                  <ANOFABRICACAO>1994</ANOFABRICACAO>
                  <ANOMODELO>1994</ANOMODELO>
                  <COMBUSTIVEL>GASOLINA</COMBUSTIVEL>
                  <COR>PRETA</COR>
                  <RENAVAM>00618596488</RENAVAM>
                  <SEGMENTO>AUTO</SEGMENTO>
                  <SUB_SEGMENTO>AU - SEDAN GRANDE</SUB_SEGMENTO>
                  <NR_MOTOR>0035110704</NR_MOTOR>
                  <NR_CAMBIO/>
                  <NR_CARROCERIA/>
                  <NR_EIXOTRASEIRO/>
                  <QUAN_EIXOS/>                     
                  <LEILAO>
                     <LEILOEIRO>N/I</LEILOEIRO>
                     <COMITENTE/>
                     <LOTE/>
                     <DATA_LEILAO>30/07/2003</DATA_LEILAO>
                     <COND_VEICULO>INTEIRO</COND_VEICULO>
                     <SIT_CHASSI/>
                     <COND_MOTOR/>
                     <COND_CAMBIO/>
                     <COND_MECANICA/>
                     <OBS/>
                  </LEILAO>
                  <LEILAO>
                     <LEILOEIRO>N/I</LEILOEIRO>
                     <COMITENTE/>
                     <LOTE>0022A</LOTE>
                     <DATA_LEILAO>30/07/2003</DATA_LEILAO>
                     <COND_VEICULO/>
                     <SIT_CHASSI/>
                     <COND_MOTOR/>
                     <COND_CAMBIO/>
                     <COND_MECANICA/>
                     <OBS/>
                  </LEILAO>
               </RESPOSTA>
            </INFO-XML>
         </consultaResult>
      </consultaResponse>
   </soap:Body>
</soap:Envelope>

Это мой класс JAXB:

@Data
@XmlRootElement(name = "consultaResponse", namespace = "http://tempuri.org/")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConsultaResponse {

    @XmlElement(name = "consultaResult", namespace = "http://tempuri.org/")
    private ConsultaResult result;

    @Data
    @XmlAccessorType(XmlAccessType.FIELD)
    public static class ConsultaResult {

        @XmlElement(name = "INFO-XML", namespace = "")
        private InfoXML infoXML;

        @Data
        @XmlAccessorType(XmlAccessType.FIELD)
        public static class InfoXML {

            @XmlElement(name = "SOLICITACAO")
            private Solicitacao solicitacao;

            @XmlElement(name = "RESPOSTA")
            private Resposta resposta;

            @XmlElement(name = "LEILAO")
            private List<Leilao> leilao;

            @Data
            @XmlAccessorType(XmlAccessType.FIELD)
            public static class Solicitacao {

                @XmlElement(name = "TIPO")
                private String tipo;

                @XmlElement(name = "DADO")
                private String dado;

                @XmlElement(name = "NUMERO_RESPOSTA")
                private String numeroResposta;

                @XmlElement(name = "TEMPO")
                private float tempo;

                @XmlElement(name = "MENSAGEM")
                private int mensagem;

                @XmlElement(name = "HORARIO")
                private int horario;

            }

            @Data
            @XmlAccessorType(XmlAccessType.FIELD)
            public static class Resposta {

                @XmlElement(name = "PLACA")
                private String placa;

                @XmlElement(name = "CHASSI")
                private String chassi;

                @XmlElement(name = "ANO")
                private String ano;

                @XmlElement(name = "MARCA_MODELO")
                private String marcaModelo;

                @XmlElement(name = "SITUACAO_CHASSI")
                private String situacaoChassi;

                @XmlElement(name = "ANOFABRICACAO")
                private int anoFabricacao;

                @XmlElement(name = "ANOMODELO")
                private int anoModelo;

                @XmlElement(name = "COMBUSTIVEL")
                private String combustivel;

                @XmlElement(name = "COR")
                private String cor;

                @XmlElement(name = "RENAVAM")
                private String renavam;

                @XmlElement(name = "SEGMENTO")
                private String segmento;

                @XmlElement(name = "SUB_SEGMENTO")
                private String subSegmento;

                @XmlElement(name = "NR_MOTOR")
                private String nrMotor;

                @XmlElement(name = "NR_CAMBIO")
                private String nrCambio;

                @XmlElement(name = "NR_CARROCERIA")
                private String nrCarroceria;

                @XmlElement(name = "NR_EIXOTRASEIRO")
                private String nrEixoTraseiro;

                @XmlElement(name = "QUAN_EIXOS")
                private int quantEixos;

            }

            @Data
            @XmlAccessorType(XmlAccessType.FIELD)
            public static class Leilao {

                @XmlElement(name = "LEILOEIRO")
                private String leiloeiro;

                @XmlElement(name = "COMITENTE")
                private String comitente;

                @XmlElement(name = "LOTE")
                private String lote;

                @XmlElement(name = "DATA_LEILAO")
                private String dataLeilao;

                @XmlElement(name = "COND_VEICULO")
                private String condLeilao;

                @XmlElement(name = "SIT_CHASSI")
                private String sitChassi;

                @XmlElement(name = "COND_MOTOR")
                private String condMotor;

                @XmlElement(name = "COND_CAMBIO")
                private String condCambio;

                @XmlElement(name = "COND_MECANICA")
                private String condMecanica;

                @XmlElement(name = "OBS")
                private String obs;

            }
        }
    }
}

У меня проблема в этом разделе, где в XML есть два элемента LEILAO:

          <LEILAO>...</LEILAO>
          <LEILAO>...</LEILAO>

В классе java похож на List, но это значение равно Null:

@XmlElement(name = "LEILAO") 
private List<Leilao> leilao;

Я не получаю никаких ошибок в консоли, а остальные атрибуты заполнены правильно.

1 Ответ

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

Используя сценарий xml2xpath для печати XPath из вашего образца XML, можно увидеть, что LIELAO является потомком RESPOSTA.
Таким образом, private List<Leilao> leilao; должен быть атрибутом Resposta, а Leilao определение класса должно быть внутренним классом Resposta.

./xml2xpath.sh -s '//INFO-XML/RESPOSTA' -x ~/tmp/test.xml 
Found XPath:

//RESPOSTA
//RESPOSTA/PLACA
<!-- more xpaths here -->
//RESPOSTA/LEILAO
//RESPOSTA/LEILAO/LEILOEIRO
<!-- more xpaths here -->
//RESPOSTA/LEILAO/OBS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...