Javadabbadoo.org - Tu comunidad Java parlante XML
Inicio | Cursos infosintesis.net liberados | Java SE Avanzado | Mani. Doc. XML con JAXB a partir de un XML Schema
Manipular un Documento XML con JAXB a partir de un XML Schema
Paso 3: Operativa

Creación de un documento XML

En la carpeta C:\isg\j2se\prosjava\projaxb nos creamos un documento XML llamado pedido.xml. Este es el contenido de este fichero

<?xml version="1.0" encoding="UTF-8"?>

<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xsi:noNamespaceSchemaLocation='pedido.xsd'>
 <enviarA pais="EEUU">
  <nombre>Alice Smith</nombre>
  <calle>123 Maple Street</calle>
  <ciudad>Cambridge</ciudad>
  <estado>MA</estado>
  <codigoPostal>12345</codigoPostal>
 </enviarA>
 <facturarA>
  <nombre>John Bob</nombre>
  <calle>242 Main Street</calle>
  <ciudad>Beverly Hills</ciudad>
  <estado>CA</estado>
  <codigoPostal>90210</codigoPostal>
 </facturarA>
 <comentario>Líneas de pedido</comentario>
 <articulos>
  <articulo codigoStock=
"872-AA">
   <nombreProducto>Cortacésped</nombreProducto>
   <cantidad>1</cantidad>
   <precioEEUU>148.95</precioEEUU>
   <comentario>Eléctrico con baterías recargables</comentario>
   <fechaEnvio>2006-06-28</fechaEnvio>
  </articulo>
  <articulo codigoStock=
"926-BC">
   <nombreProducto>Bolsa de tierra de abono marca Acme</nombreProducto>
   <cantidad>1</cantidad>
   <precioEEUU>7.20</precioEEUU>
  </articulo>
 </articulos>
</pedido>

Copia de las Clases Java generadas a través del compilador de JAXB a nuestro proyecto

Para poder acceder a las Clases generada a través del compilador de JAXB desde NetBeans, las vamos a copiar a nuestro proyecto

Una vez copiadas las Clases este es el aspecto que presentan en NetBeans. Por un lado tenemos el paquete paqjaxb en el cual crearemos una Clase para que acceda, modifique y muestre la dirección de facturación y por otro lado tenemos el paquete jaxb.pedido con las Clases generadas por el compilador de JAXB

Añadir la API JAXB a nuestro proyecto

Como podemos observar al proyecto projaxb le falta conocer el path para poder ver la API JAXB. Para solventarlo, vamos a añadir la libreria JAXB 2.0 que nos ofrece NetBeans

Compilar las Clases Java generadas a través del compilador de JAXB

Ahora ya podemos compilar las Clases del paquete jaxb.pedido

Crear una Clase que modifica de forma transparente un documento XML

Este es el código fuente correspondiente a la Clase ModificaMuestraPedido que pertenece al paquete paqjaxb

package paqjaxb;

import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import jaxb.pedido.DireccionEEUU;
import jaxb.pedido.PedidoType;

public class ModificaMuestraPedido {

 public static void main(String[] args) {
  try {
   JAXBContext jaxbContext = JAXBContext.newInstance("jaxb.pedido");

   Unmarshaller u = jaxbContext.createUnmarshaller();
   JAXBElement jaxbElement = (JAXBElement) u.unmarshal(
                               new FileInputStream("pedido.xml"));

   PedidoType pedidoType = (PedidoType) jaxbElement.getValue();

   DireccionEEUU direccionEEUU = pedidoType.getFacturarA();
   direccionEEUU.setNombre("Julian Nader");
   direccionEEUU.setCalle("25 Lake Street");
   direccionEEUU.setCiudad("Mission Viejo");
   direccionEEUU.setEstado("CA");
   direccionEEUU.setCodigoPostal(new BigDecimal("92692"));

   Marshaller m = jaxbContext.createMarshaller();
   m.
setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
   m.
marshal(jaxbElement, System.out);
  } catch (JAXBException je) {
    je.printStackTrace();
  } catch (IOException ioe) {
   ioe.printStackTrace();
  }
 }
}

Y esta es la salida al ejecutar la aplicación

Recorrer los subelementos de un elemento

Ahora vamos a recorrer cada uno de los artículos del pedido y los vamos a mostrar en la salida estándar de la siguiente forma

De esta forma vamos a ver como podemos acceder a los diferentes subelementos articulo que están anidados en el elemento articulos del documento pedido.xml

Para ello tenemos que ampliar la Clase ModificaMuestraPedido.

Nota: Para recordar la forma de iterar colecciones podemos echar un vistazo a la siguiente página Síntesis Foro Java SE - Como iterar colecciones con “foreach”

package paqjaxb;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

import java.math.BigDecimal;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import jaxb.pedido.DireccionEEUU;
import jaxb.pedido.PedidoType;
import jaxb.pedido.Articulos;
import jaxb.pedido.
Articulos.Articulo;

public class ModificaMuestraPedido {

 public static void main(String[] args) {
  try {
   JAXBContext jaxbContext = JAXBContext.newInstance("jaxb.pedido");

   Unmarshaller u = jaxbContext.createUnmarshaller();
   JAXBElement jaxbElement = (JAXBElement) u.unmarshal(
                               new FileInputStream("pedido.xml"));
   PedidoType pedidoType = (PedidoType) jaxbElement.getValue();

   DireccionEEUU direccionEEUU = pedidoType.getFacturarA();
   direccionEEUU.setNombre("Julian Nader");
   direccionEEUU.setCalle("25 Lake Street");
   direccionEEUU.setCiudad("Mission Viejo");
   direccionEEUU.setEstado("CA");
   direccionEEUU.setCodigoPostal(new BigDecimal("92692"));

   Articulos articulos = pedidoType....
   List<Articulo> listaArticulos = articulos.
...
   iterarColeccionForeach(listaArticulos);

   Marshaller m = jaxbContext.createMarshaller();
   m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
   m.marshal(jaxbElement, System.out);
  } catch (JAXBException je) {
    je.printStackTrace();
  } catch (IOException ioe) {
   ioe.printStackTrace();
  }
 }

 private static void iterarColeccionForeach(List<Articulo> lista) {
  for (
... articulo : lista){
   System.out.println("-----------------------");
   System.out.println(articulo.
...);
   System.out.println(articulo.
...);
   System.out.println(articulo.
...);
  }
 }

}


Compara tu código con la solución propuesta

Crear un nuevo documento XML a partir de las instancias de las Clases generadas por el compilador JAXB

Finalmente vamos a realizar los dos últimos cambios.

Uno de ellos consiste en pasar a mayúsculas el nombre de los productos de cada uno de los artículos y lo mostramos a través de la consola de la siguiente forma

El otro cambio consiste en crear un nuevo documento XML llamado pedidomodificado.xml que refleje todos los cambios realizados en las instancias del las Clases generadas por el compilador JAXB.

Para realizar estos dos cambios nos basamos en el siguiente código

package paqjaxb;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import java.math.BigDecimal;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import jaxb.pedido.DireccionEEUU;
import jaxb.pedido.PedidoType;
import jaxb.pedido.Articulos;
import jaxb.pedido.Articulos.Articulo;

public class ModificaMuestraPedido {

 public static void main(String[] args) {
  try {
   JAXBContext jaxbContext = JAXBContext.newInstance("jaxb.pedido");

   Unmarshaller u = jaxbContext.createUnmarshaller();
   JAXBElement jaxbElement = (JAXBElement) u.unmarshal(
                               new FileInputStream("pedido.xml"));
   PedidoType pedidoType = (PedidoType) jaxbElement.getValue();

   DireccionEEUU direccionEEUU = pedidoType.getFacturarA();
   direccionEEUU.setNombre("Julian Nader");
   direccionEEUU.setCalle("25 Lake Street");
   direccionEEUU.setCiudad("Mission Viejo");
   direccionEEUU.setEstado("CA");
   direccionEEUU.setCodigoPostal(new BigDecimal("92692"));

   Articulos articulos = pedidoType.getArticulos();
   List<Articulo> listaArticulos = articulos.getArticulo();
   iterarColeccionForeach(listaArticulos);

   cambiarNombreProductosMayusculas(listaArticulos);

   Marshaller m = jaxbContext.createMarshaller();
   m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
   m.marshal(jaxbElement, System.out);

   m.marshal(jaxbElement, ...));
  } catch (JAXBException je) {
    je.printStackTrace();
  } catch (IOException ioe) {
   ioe.printStackTrace();
  }
 }

 private static void iterarColeccionForeach(List<Articulo> lista) {
  for (Articulo articulo : lista){
   System.out.println("-----------------------");
   System.out.println(articulo.getCodigoStock());
   System.out.println(articulo.getNombreProducto());
   System.out.println(articulo.getCantidad());
  }
 }

 private static void cambiarNombreProductosMayusculas(List<Articulo> lista) {
  for (Articulo articulo : lista){
   System.out.println("-----------------------");
   System.out.println(articulo.getCodigoStock());
   articulo.setNombreProducto(articulo.getNombreProducto().
...);
   System.out.println(articulo.getNombreProducto());
   System.out.println(articulo.getCantidad());
  }
 }

}


Compara tu código con la solución propuesta

JavaDabbaDoo.org
Tu comunidad Java parlante. Cursos abiertos, tutoriales y mucho mucho más ...