OBJETIVO:
Implementar una aplicación Java con el api de JAXB para obtener datos de un libro Exel 2007 que vincula un XML Schema previamente diseñado.
¿Que es Jaxb?
JAXB (Java Architecture For XML Binding) es un framework de licencia dual CDDL v1.0 y GPL v2. que simplifica la gestión de documentos XML desde Java.
Apartir de un Schema XML, JAXB conforma un set de classes e interfaces que junto al api JSE+JAXB, permiten manipular documentos XML basados en el esquema previsto.
JAXB en combinación con JAX-WS (Java Api For XML Web Services) proporcionan el standard de vinculación de datos en mensajes de servicios web. La siguiente gráfica describe los procesos a seguir para construir una aplicación java basada en JAXB, observese como primero se debe compilar el XML Schema con binding compiler, luego de esto se obtiene un conjunto de clases e interfaces, que se adjuntan al proyecto java en un package junto con los jars que conforma el api JAXB (como se verá más adelante).La aplicación tendrá la funcionalidad para realizar operaciones tipo Unmarshal, que es la habilidad de convertir datos XML en un arbol de objetos java, y operaciones de tipo Marshal, que es la capacidad de convertir un arbol de objetos java en datos XML.
A lo largo de este documento se construirá un ejemplo simple que muestra la forma básica de manipular este framework.
RECURSOS:
-
Windows XP/Vista.
-
JDK 6.x.
-
JAXB 2.1.8
-
NetBeans 6.1 (se puede utilizar otro IDE no es relevante).
-
Microsoft Exel 2007 (se pude utilizar Open Office Cal, lo significativo es crear un libro y vincular a este el es esquema diseñado).
PASOS A SEGUIR:
-
Crear proyecto java.
-
Crear XML Shema.
-
Crear Libro Exel 2007 vinculando el XML Schema.
-
Exportar hoja exel a documento XML.
-
Compilar el XML Shema y crear package de clases.
-
Adjuntar api de JAXB al proyecto.
-
Implementar clase main.
-
Construir el proyecto y compilar.
1. Crear proyecto java.
Realice lo siguiente:
-
Inicie NetBeans, luego oprima al tiempo las teclas Ctrl+Mayúsculas+N, aparecerá la ventana New Project, realice las siguientes acciones en esta:
-
Seleccione el fólder Java en la columna Categories de la ventana.
-
Seleccione el icono Java Application en la columna Projects de la ventana.
-
De clic en el botón Next de la ventana. Aparecerá la ventana New Java Application.
2. En la ventana New Java Application, realice las siguientes acciones:
-
En el campo Project Name escriba jaxbExample.
-
En el el campo Project Location escriba la siguinte ubicación C:\sampleJAXB.
-
De clic en Finish. El nodo del proyecto aparecerá en la pestaña Projects de menu a la izquierda de NetBeans.
La siguiente figura muestra el proyecto creado:
2. Crear XML Shema.
Realice lo siguiente:
1. Cree un package para agregar esquemas y documentos XML:
-
Dirijase al nodo del proyecto y de clic en el [+], luego de clic derecho en el fólder Source Packages. Seleccione New / Java Package. Aparecerá una ventana llamada New Java Package.
-
Escriba schemaAndDoc en el campo Package Name de la ventana New Java Package. Luego de clic en el botón Finish. Aparecerá el package bajo el fólder Source Packages.
2. Cree un XML Schema dentro del package schemaAndDoc:De clic derecho sobre el package schemaAndDoc, seleccione New / XML Schema. Aparecerá la ventana New XML Schema.
-
Escriba Schema en el campo File Name de la ventana New XML Schema. Luego de clic en Finish. Bajo el package schemaAndDoc aparecerá el archivo Schema.xsd, y en la parte derecha se mostrará un diagrama esquematico del archivo con tres pestañas en la parte superior izquierda, de clic en la pestaña Source, borre los datos encontrados y copie el siguiente codigo:
-
|
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://xml.netbeans.org/schema/Schema"
xmlns:tns="http://xml.netbeans.org/schema/Schema"
elementFormDefault="qualified">
<xsd:element name="order">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="semiconductors">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="transistors">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="T2N2222" type="xsd:string"/>
<xsd:element name="T2N3906" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="timers">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="NE555" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="analogics">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="capacitors">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="C1P" type="xsd:string"/>
<xsd:element name="C0.1P" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
|
Oprima al tiempo las teclas Ctrl+Mayúsculas+S para salvar los cambios en el archivo.
3. Crear Libro Exel 2007 vinculando el XML Schema.
-
Copie el archivo C:\sampleJAXB\jaxbExample\src\schemaAndDoc\Schema.xsd en la carpeta raiz del proyecto C:\sampleJAXB. Este será el esquema para exel.
-
Inicie Microsoft Exel 2007, dirijase al botón de office
ubicado en la parte superior izquierda de la ventana, luego de clic en el botón Opciones de Exel y seleccione Mostrar Ficha Programador en la cinta opciones, luego de clic en aceptar.
-
De clic en la pestaña Programador que aparece en la cinta de opciones (bajo el título del libro). luego de clic en el icono Origen del grupo XML, aparecerá a la orilla derecha del documento el area Origen XML, en la parte inferior de esta area de clic en el botón Asignaciones XML. Aparecerá la ventana Asignaciones XML.
-
De clic en el botón Agregar y seleccione el archivo C:\sampleJAXB\Schema.xml.
-
Cree un formulario con los siguientes datos:
|
Products
|
|
|
Transistors
|
Cantidad
|
|
2N2222
|
>>Arrastre el elemento ns1:T2N2222
|
|
2N3906
|
>>Arrastre el elemento ns1:T2N3906
|
|
Timers
|
|
|
NE555
|
>>Arrastre el elemento ns1:NE555
|
|
Capacitors
|
|
|
1P
|
>>Arrastre el elemento ns1:C1P
|
|
0,1P
|
>>Arrastre el elemento ns1:C0.1P
|
-
luego seleccione y arrastre los elementos del esquema desplegados en el area Origen XML a los campos apropiados, escriba algunos valores en estos, la siguiente figura ilustra como se realiza este procedimiento.
4. Exportar hoja Exel a documento XML.
-
De clic en el icono Exportar del grupo de controles XML ubicado en la ventana programador.
-
Guarde el archivo en C:\sampleJAXB\jaxbExample\src\schemaAndDoc\ con el nombre Producto.xml.
5. Compilar el XML Shema y crear package de clases.
Descarge JAXB 2.1.8 de el siguiente enlace https://jaxb.dev.java.net/ y descomprima el archivo en C:\>. Basicamente JAXB consta de 2 elementos, el binding compiler que es el archivo xjc.bat ubicado en C:\jaxb-2_1_8\jaxb-ri\bin y el api que son los archivos con extención jar ubicados en C:\jaxb-2_1_8\jaxb-ri\bin.
Abra una consola DOS y apunte a la siguiente ubicacion: C:\jaxb-2_1_8\jaxb-ri\bin>, ejecute la siguiente instrucción: xjc.bat C:\sampleJAXB\jaxbExample\Schema.xsd -p Productos . Con este comando se le indica al compilador que cree un set de clases apartir del archivo Schema.xsd previamente creado, y que guarde las clases en fólder Productos.
Para adicionar las clases al projecto java, copie el fólder C:\jaxb-2_1_8\jaxb-ri\bin\Productos en C:\sampleJAXB\jaxbExample\src, de esta manera el proyecto tendrá tres paquetes. jaxbexample, productos y schemaAndDoc. Observe las siguientes figuaras que ayudarán a comprender estos procesos:
6. Adjuntar api de JAXB al proyecto.
-
Seleccione los archivos con extención jar (estos conforman el api JAXB) de la ubicación C:\jaxb-2_1_8\jaxb-ri\lib, y cópielos en un fólder con el nombre jaxb218, dentro de C:\sampleJAXB\.
-
En NetBeans de clic derecho en el nodo del proyeto y seleccione Properties, Aparecerá la ventana Project Properties.
-
Seleccione el item Libraries en la columna Categories de la ventana ProjectProperties luego de clic en el botón Add JAR/Folder y seleccione el fólder que contiene los jars de JAXBE, es decir el fólder C:\sampleJAXB\jaxb218, luego de clic en OK. Observe la siguiente figura como guia.
7. Implementar clase main.
-
En NetBeans de clic en el nodo del proyecto, seleccione el fólder Source Packages, luego de clic en [+] del package jaxbexample, y de doble clic en el archivo Main.java. En la parte izquierda aparecerá el contenido de la clase main, copie el siguiente código para realizar la operción Unmarshal sobre el documento Producto.xml creado por Exel, simplemente se obtienen los datos y se muestran por consola:
package jaxbexample;
import java.io.FileInputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import productos.Order;
/**
*
* @author giovynet
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception{
/*Crea un objeto de tipo unmarshaller apartir de el package "productos"
*que presenta las clases creadas por el binding compiler de jaxb.
*/
Unmarshaller unmarshaller = JAXBContext.newInstance("productos").createUnmarshaller();
/* Obtiene el objeto Order que equivale a el elemento raiz order del
*archivo Productos.xml creado por Exel.
*/
Order order = (Order)unmarshaller.unmarshal(new FileInputStream("src/schemaAndDoc/Productos.xml"));
System.out.println("============PRODUCTS============");
System.out.println("Transitors:2N2222, amount:"+order.getSemiconductors().getTransistors().getT2N2222());
System.out.println("Transitors:2N3906, amount:"+order.getSemiconductors().getTransistors().getT2N3906());
System.out.println("Timers:NE555, amount:"+order.getSemiconductors().getTimers().getNE555());
System.out.println("Capacitors:1P, amount:"+order.getAnalogics().getCapacitors().getC1P());
System.out.println("Capacitors:0.1P, amount:"+order.getAnalogics().getCapacitors().getC01P());
System.out.println("================================");
}
}
|
8. Construir el proyecto y compilar.
En NetBeans de clic derecho en el nodo del proyecto y seleccione Clean and Build, luego seleccione el fólder Source Packages,de clic en [+] del package jaxbexample, de clic derecho sobre el archivo Main.java y selecione Run File.
Comments to giovynet@gmail.com
Thanks!!!