Search code examples
javaarraysxmljava-8

Map XML repet tag to Java object


I have the next xml:

<mensajeWS>
    <respuestaGetCabecerasType>
        <cabeceras>
            <cabecera>
                <id>1234</id>
                <tipoMensaje>3</tipoMensaje>
                <datos>
                    <fechaEnvio>2023-12-13T00:05:00</fechaEnvio>
                    <fechaEnvio>2023-12-14T00:05:00</fechaEnvio>
                </datos>
            </cabecera>
        </cabeceras>
    </respuestaGetCabecerasType>
</mensajeWS>

And I want to map their data into the following object:

public class Cabecera implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -865317642824095952L;
    
    private int id;
    
    private int tipoMensaje;
    
    private DatosRecepcion datos;

DatosRecepcion is a class with the following variable:

public class DatosRecepcion implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -6703565058845907875L;
    
    private List<String> fechaEnvio;


To map the xml data to the object, do the following:

List<Cabecera> listaCabeceras = new ArrayList<Cabecera>();
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new InputSource(new StringReader(xml.toString())));
            
            System.out.println("Root element: " + document.getDocumentElement().getNodeName());
            
            NodeList nList = document.getElementsByTagName("cabecera");
            for(int i = 0; i < nList.getLength(); i++) {
                Node nNode = nList.item(i);
                System.out.println("Current Element: " + nNode.getNodeName());
                
                Element element = (Element) nNode;
                System.out.println("id: " + element.getElementsByTagName("id").item(0).getTextContent());
                System.out.println("Tipo de mensaje: " + element.getElementsByTagName("tipoMensaje").item(0).getTextContent());
                System.out.println("Fecha de Envio: " + element.getElementsByTagName("fechaEnvio").item(0).getTextContent());
                
                Cabecera cabecera = new Cabecera();
                cabecera.setId(Integer.parseInt(element.getElementsByTagName("id").item(0).getTextContent()));
                cabecera.setTipoMensaje(Integer.parseInt(element.getElementsByTagName("tipoMensaje").item(0).getTextContent()));
                //cabecera.getDatos().setFechaEnvio(element.getElementsByTagName("fechaEnvio").item(0).getTextContent());
                listaCabeceras.add(cabecera);

I would like to know how to map a repeating tag like fechaEnvio to my Java Object. I use version 8 of Java and they won't let me use a higher one at the moment

Thanks.

Map XML repet tag to Java object


Solution

  • You can do it like this way:

    Node datosNode = element.getElementsByTagName("datos").item(0);
    Element elementDatos = (Element) datosNode;
    NodeList fechaEnvioList = elementDatos.getElementsByTagName("fechaEnvio");
    List<String> data = new ArrayList<>();
    for (i = 0; i < fechaEnvioList.getLength(); i++) {
        data.add(fechaEnvioList.item(i).getTextContent());
    }
    
    cabecera.getDatos().setFechaEnvio(data);
    listaCabeceras.add(cabecera);
    

    In Cabecera class

    private DatosRecepcion datos = new DatosRecepcion();