2010-08-04 21 views
8

La documentación de JAXB es como un libro de texto, y simplemente no tengo que tiempo para aprender todo JAXB antes de necesitar usarlo.JAXB Work-Flow - ¿Cómo se puede utilizar JAXB

Tengo un XSD, si quiero usar JAXB para ordenar y des-ordenar lo que es el flujo de trabajo?

No necesito ningún detalle solo una vista de alto nivel.

lo que ya sé: 1. JAXB se puede utilizar para tomar objetos y crear documentos XML a partir de ellos y viceversa 2. Utiliza un misterioso herramienta llamada "XJC" que no he sido capaz de encontrar una descarga de CUALQUIER LUGAR en su sitio web 3. XJC crea clases para usted según XSD

Primero, ¿cómo puedo encontrar XJC? De hecho, sé que está instalado en mi sistema, aunque no estoy seguro de dónde lo obtuve.
En segundo lugar, cualquiera que sea esta herramienta y cómo llegó a mi máquina, ¿cómo la hago funcionar con la versión más actualizada de JAXB? En tercer lugar, si mis cambios en XSD realmente tengo que volver a crear todo el objeto de Java, lo que posiblemente invalidará todas mis pruebas. ¿O puedo definir el objeto para las asignaciones de XSD para que tenga el control de la asignación, no una generación de código predeterminada?

En general, estoy acostumbrado a tomar XML y usar algo como xStream para deshacerme manualmente, pero eso ya no es una opción para mis propósitos.

Respuesta

15

Asumiendo que tiene JDK6;

xjc está en el bin/carpeta de su JDK, algo así como C: \ Archivos de programa (x86) \ Java \ jdk1.6.0_20 \ bin \ xjc.exe

El JDK viene con jaxb, mientras que hay Puede haber versiones más nuevas de http://jaxb.java.net/ u otras implementaciones disponibles, es probable que no tenga que preocuparse por eso en este momento.

JAXB puede hacer muchas cosas, no estoy muy seguro de exactamente lo que está tratando de lograr. Si tiene una xsd, puede generar clases de Java ejecutando, por ejemplo,

xjc -p com.mypackage myschema.xsd 

e incluyen las clases generadas en su proyecto (Más típicamente que había corrido que como parte de su proceso de construcción).

O puedo definir objeto de asignaciones XSD por lo que estoy en el control de la asignación, no una generación de código por defecto?

Las clases generadas son solo pojos con algunas anotaciones, puede crear esas clases usted mismo y tener el control total de la asignación mediante anotaciones.

Como se ha dicho, jaxb puede hacer muchas cosas, he aquí algunos ejemplos básicos, SearchParam/PALABRA es una clase generada por xjc de un pequeño encargo .xsd

serializar un objeto a un archivo XML

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Marshaller marshaller = context.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
List<String> hours = new LinkedList<String>(); 
hours.add("2009.12.11"); 
hours.add("2009.12.13"); 

SearchParam param = new SearchParam(); 
param.setFilter("greater"); 
param.setHours(hours); 
param.setSearchType(SearchType.Fuzzy); 
marshaller.marshal(param, new FileWriter("/tmp/SearchParam.xml"));  

deserializar un archivo XML

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Unmarshaller unMarshaller = context.createUnmarshaller(); 
SearchParam param = (SearchParam) unMarshaller.unmarshal(
        new FileInputStream("/tmp/SearchParam.xml")); 

Deserialize y hacer la validación del esquema

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Unmarshaller unMarshaller = context.createUnmarshaller(); 
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) 
       .newSchema(new File("/tmp/schema1.xsd")); 
unMarshaller.setSchema(schema); 
SearchParam param = unMarshaller.unmarshal(
         new FileInputStream("/tmp/SearchParam.xml")); 

Más información

+0

En primer lugar, gran respuesta, apreciaron. Pregunta: Entonces, ¿normalmente crearía los objetos Java y luego simplemente los pegaría en su proyecto? Usted dice que a menudo sería parte del guión de compilación, pero eso me parece algo retrógrado, porque entonces ¿cómo sabrá que el código que está escribiendo que usa esos objetos se compilará, y mucho menos se ejecutará como se esperaba? Además, cosas como el autocompletado no podrían funcionar porque los objetos no existen hasta que construyas el proyecto. – walnutmon

+0

Claro, "copiar/pegar" el código generado está bien; el inconveniente es que debe recordar hacer eso cuando cambie el esquema. Si lo haces como parte de tu compilación, la función autocompletar funcionará bien, solo debes ejecutar la compilación una vez. Si su proyecto compila o funciona como se espera no es diferente de ejecutar xjc "a mano", y es posible que la prueba unitaria detecte la mayoría de estos errores. – nos

1

Es probable que ya tenga instalado XJC. Verifique el directorio bin de su instalación JDK 6. Una vez encontrado si solo ejecuta XJC, le dará las opciones de línea de comando.

JAXB es una especificación, por lo que hay varias implementaciones:

  • Metro (RI), las emisiones alinear estrechamente con las actualizaciones de JDK por lo que si usted tiene una reciente JDK que debe ser bueno.
  • moxy JAXB, parte de EclipseLink disponible aquí, http://www.eclipse.org/eclipselink/moxy.php

Si modifica el esquema de usted será capaz de ajustar su modelo de objetos, especialmente con las extensiones moxy.

Para empezar ve: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted