XML

Exportar objetos Java a un archivo XML.

En esta apartado conocera como se puede crear un archivo XML el contenido proviene de objetos Java, es decir se exportarán esos objetos a un archivo con formato XML.

Dentro del lenguaj de programacion Java el proceso de exportar objetos a una estructura XML se conoce como marshal.

En las últimas versiones de Java el trabajo con XML se puede hacer luego de cargar al menos un par de librerias, ya que soporte nativo fue eliminado cuando se empezo a trabajar en el proceso de modulizar el lenguaje.

Librerias

Para la gestion de las dependencias, es decir, librerias externas que no son parte de las librerías del lenguaje se usará Maven, es por eso que aqui se presentan las dependencias Maven que se ubican el archivo POM.

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>3.0.1</version>
</dependency>

El modelo

Recuerde que un documento XML representa una jerarquia, esas jerarquia se debe representar en Java a traves de las relaciones entre clases. El diagrama de clases que se usara es el siguiente:

En el diagrama anterior se puede interpretar asi: la clase Tablas está formada por varias tablas y cada tabla tiene varios campos (que los puede entender como columnas).

Es momento de presentar el código de cada una de las clases. Comenzará con la clase Campo:

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Campo {
    @XmlAttribute
    private int order;
    private String nombre;
    private String tipo;
    private int longitud;

    public Campo() {
    }

    public Campo(int order, String nombre, String tipo, int longitud) {
        this.order = order;
        this.nombre = nombre;
        this.tipo = tipo;
        this.longitud = longitud;
    }
}

Como puede ver se trata de una clase que tiene sus atributos y dos constructores, por ahora no se necesita nada más.

import jakarta.xml.bind.annotation.*;

import java.util.List;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Tabla {
    @XmlAttribute
    private int order;
    private String nombre;
    @XmlElementWrapper(name = "campos")
    @XmlElement(name="campo")
    private List<Campo> campos;

    public Tabla() {
    }

    public Tabla(int order, String nombre, List<Campo> campos) {
        this.order = order;
        this.nombre = nombre;
        this.campos = campos;
    }
}

La clase Tabla también es una clase con solo atributos y constructores. Finalmente la clase Tablas:

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

import java.util.List;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Tablas {
    @XmlElement(name = "tabla")
    private List<Tabla> tablas;

    public Tablas() {
    }

    public Tablas(List<Tabla> tablas) {
        this.tablas = tablas;
    }
}

La diferencia de las clases anteriores con cualquier otra clase es el uso de anotaciones, sentencias que inician con la @, esas anotaciones tiene por objetivo agregar datos que luego el compilador de Java puede interpretar. Entre las anotaciones presentes se marca o señala ciertos elementos como clases o atributos tienen un comportamiento diferente.

Finalmente la clase que contiene el método principal.

import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;

import java.io.File;
import java.util.List;

public class TablasXMLGenerator {
    public static void main(String[] args) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(Tablas.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        Campo campo1 = new Campo(1, "Nombre", "Char", 50);
        Campo campo2 = new Campo(2, "Apellidos", "Char", 100);
        Campo campo3 = new Campo(3, "dni", "Char", 10);
        List<Campo> camposT1 = List.of(campo1, campo2, campo3);

        Tabla tabla1 = new Tabla(1, "tabla1", camposT1);

        List<Campo> camposT2 = List.of(
                new Campo(1, "Código", "Int", 50),
                new Campo(2, "Nombre", "Char", 100),
                new Campo(3, "Descripción", "Char", 10));

        Tabla tabla2 = new Tabla(2, "tabla2", camposT2);

        Tablas tablas = new Tablas(List.of(tabla1, tabla2));

        marshaller.marshal(tablas, new File("tablas.xml"));
    }
}

Last updated