程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何将具有重复元素的 XML 转换为 Java 对象 (JAXB)

发布于2021-08-02 20:21     阅读(1130)     评论(0)     点赞(22)     收藏(0)


我在将重复的 XML 元素转换为对象时遇到问题。我通过 SOAP 网络服务获取这个 XML。这是 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 中有两个 Elements LEILAO:

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

在类中 java 就像 List,但是这个值是 Null:

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

我在控制台中没有收到任何错误,其他属性也正确填写。


解决方案


使用xml2xpath脚本从您的 XML 示例中打印 XPath,可以看出 LIELAO 是 RESPOSTA 的子项。
因此,private List<Leilao> leilao;应该是 的属性,RespostaLeilao类定义应该是 的内部类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


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/253650/419e0690632193f8008f/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)