Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Convertir objetos java en XML

Convertir objetos java en XML

Autor jc mouse lunes, marzo 11, 2019

Continuando con el estudio del meta lenguaje XML (Lenguaje de Marcado Extensible) bastante utilizado en el intercambio de información entre diferentes plataformas, en este post realizaremos un ejemplo de como pasar objetos java a XML.

¿Que necesitamos?

  • Java 8 o superior
  • JAXB (Java Architecture for XML Binding) Incluido en el JDK así que no es necesario agregar ninguna dependencia más.
  • IDE Netbeans (o el IDE de tu preferencia)
  • Conocimientos básicos sobre el lenguaje de marcas

Planteando nuestro escenario

Nuestro ejemplo simulara una «Tienda ABC» y la venta de productos a un cliente por lo que podemos plantear un modelo básico de la siguiente forma:

diagrama

Pasando el modelo a clases java tenemos:

Cliente:

import java.util.ArrayList;

public class Cliente {

    private String dni;
    private String nombre;
    private ArrayList<Producto> productos;

    public Cliente() {}

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public ArrayList<Producto> getProductos() {
        return productos;
    }

    public void setProductos(ArrayList<Producto> productos) {
        this.productos = productos;
    }
}

Producto:

public class Producto {
    
    private String codigo;    
    protected String descripcion;    
    private double precio;

    public Producto() {}    

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public double getPrecio() {
        return precio;
    }

    public void setPrecio(double precio) {
        this.precio = precio;
    }
}

Como siguiente paso debemos agregar a nuestras clases las anotaciones propias de JAXB para controlar la correcta generación de XML desde nuestros objetos java.

Nuestras clases Cliente y Producto quedan de la siguiente forma:

Cliente:

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {    
    "dni",
    "nombre",
    "productos"
})
@XmlRootElement(name = "cliente")
public class Cliente {

    @XmlElement(name = "dni", required = true)
    private String dni;
    @XmlElement(name = "nombre", required = true)
    private String nombre;
    @XmlElementWrapper(name = "productos")
    @XmlElement(name = "producto")
    private ArrayList<Producto> productos;

    public Cliente() {
    }

    public Cliente(String dni, String nombre, ArrayList<Producto> productos) {
        this.dni = dni;
        this.nombre = nombre;
        this.productos = productos;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public ArrayList<Producto> getProductos() {
        return productos;
    }

    public void setProductos(ArrayList<Producto> productos) {
        this.productos = productos;
    }

}

Producto:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {    
    "descripcion",
    "precio"        
})
@XmlRootElement(name = "producto")
public class Producto {

    @XmlAttribute(required = true)
    private String codigo;
    @XmlElement(name = "descripcion", required = true)
    protected String descripcion;
    @XmlElement(name = "precio", required = true)
    private double precio;

    public Producto() {
    }

    public Producto(String codigo, String descripcion, double precio) {
        this.codigo = codigo;
        this.descripcion = descripcion;
        this.precio = precio;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public double getPrecio() {
        return precio;
    }

    public void setPrecio(double precio) {
        this.precio = precio;
    }
}

A continuación explicaremos las anotaciones JAXB utilizadas en este post:

  • @XmlAccessorType: Proporciona control sobre la serialización al definir los campos y las propiedades de las clases de Java que utiliza el motor JAXB para el binding.
  • @XmlType: Asigna un esquema a la clase java, en este ejemplo, indica el orden de los hijos
  • @XmlRootElement: Define el elemento raíz del documento XML. En nuestro ejemplo la raíz sera «cliente«. Si no se indica, se toma el nombre de la clase
  • @XmlElement: Esta anotación se utiliza en las propiedades de la clase que serán los sub-elementos del elemento raíz.
  • @XmlElementWrapper: Esta anotación nos permite asignar una colección java a una colección XML

Ya para terminar, debemos implementar el código necesario para generar el XML.

En una clase Main escribimos:

import java.util.ArrayList;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class Main {

    public static void main(String[] args) {        
        try {
            /**
             * La clase JAXBContext proporciona el punto de entrada del cliente a la API de JAXB
             */
            JAXBContext jaxbContext = JAXBContext.newInstance(Cliente.class);            
            /**
             * La clase Marshaller proporciona a la aplicación cliente la capacidad 
             * de convertir un árbol de contenido Java en datos XML. 
             */
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            
            /**
             * Creamos una objeto cliente y agregamos algunos datos
             */
            ArrayList<Producto> productos = new ArrayList<>();
            productos.add(new Producto("P123","Televisor",110.50));
            productos.add(new Producto("P345","Silla",39.75));
            productos.add(new Producto("P789","Escritorio",469.99));
            Cliente cliente = new Cliente("1234567","Lola Mento Mucho",productos);                        
            
            /**
             * Se definen algunas propiedades standar
             */            
            //Datos formateados con salto de linea y sangria
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            //Especifica el valor del atributo xsi: schemaLocation para colocar en la salida XML 
            jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
            //Codificacion de salida
            jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");            
            //El nombre del esquemaXSD para el atributo xsi: noNamespaceSchemaLocation
            jaxbMarshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "miesquema.xsd");
            
            /**
             * Se genera el XML y se muestra en consola
             */
            jaxbMarshaller.marshal(cliente, System.out);                                   
            
        } catch (JAXBException ex) {
            System.err.println(ex.getMessage());                        
        }        
    }
    
}

y como resultado obtendremos en pantalla:

java a XML

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Transición de imágenes al estilo PowerPoint

Transición de imágenes al estilo PowerPoint

¿Qué es una transición? Una transición es un efecto de movimiento que se da entre una imagen y la siguiente en una prese...

Pruebas funcionales con AssertJ Swing

Pruebas funcionales con AssertJ Swing

AssertJ Swing es una biblioteca para Java que proporciona una interfaz fluida para la realización automatizada de prueba...

MVC Java y Base de Datos Tutorial

MVC Java y Base de Datos Tutorial

En post pasados [Ejemplo práctico de MVC java Swing con Netbeans, 3 en raya java con MVC y Netbeans , MVC: Modelo, Vista...

Renombrar atributos JSON con GSON

Renombrar atributos JSON con GSON

Si quieres cambiar el nombre de tus atributos sin tener que reescribir código java por X o Y razón, GSON te permite reno...

Contraseñas con emojis en java

Contraseñas con emojis en java

Semanas atrás leí un articulo en el que se pensaba implementar los emojis como contraseñas en los dispositivos con andro...

Estilos condicionales en iReport

Estilos condicionales en iReport

iReport nos da la posibilidad de dar un formato condicional a los diferentes registros resultado de nuestras consultas S...

Comparte lo que sabes

Categorias

Últimas entradas

Quasar es un proyecto Open Source basado en el Framework Vue que nos permite desarrollar proyectos de todo tipo, por eje...

Continuando el post de «Introducción a Retrofit» donde realizamos una breve preparación a lo que es el uso de la librerí...

Editar un documento PDF no es tan sencillo como editar un archivo de texto por ejemplo, para editar archivos PDFs necesi...

¿Alguna vez tuviste la necesidad de hacer una captura de pantalla de una página web? Si es así, seguramente buscaste y d...

Herramientas

Generador de Enlaces a Whatsapp