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?
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:
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:
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:
enjoy!!!
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! :)
En este tutorial, veremos un poco más de lo que son las texturas en libGDX y dos maneras de añadirlas a nuestros juegos,...
Problema: Implemente el código necesario en Kotlin para resolver una ecuación de segundo grado de números reales: Soluci...
Matando dos pájaros de un solo tiro :), doy respuesta a un par de preguntas que están relacionadas, en este post veremos...
Cuando se crean aplicaciones android o cualquier otro tipo de software, es importante dejar información del o los desarr...
Eratóstenes era un matemático griego del siglo III a.C. el cual ideó una manera rápida de obtener todos los números pri...
Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...
El gigante tecnologico Google a puesto un bonito Doodle en su buscador que esta fascinando a sus millones de usuarios qu...
WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...
Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...
TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...