Tengo un gigantesco archivo de esquema QuickBooks SDK .XSD que define las solicitudes / respuestas XML que puedo enviar / recibir desde QuickBooks.
Me gustaría poder generar fácilmente clases Java a partir de estos archivos .XSD, que luego podría usar para reunir XML a objetos Java y objetos Java a XML.
Hay una forma fácil de hacer esto...?
Idealmente, no requeriría ninguna biblioteca externa a la distribución básica de Java en tiempo de ejecución. Pero soy flexible ...
Respuestas:
JAXB hace EXACTAMENTE lo que quieres. Está integrado en el JRE / JDK a partir de 1.6
fuente
Para ampliar los comentarios anteriores sobre "usar JAXB",
En Windows
"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd
p.ej,
"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
Espere un poco, y si tuviera un archivo XSD bien formado, obtendrá algunas clases de Java bien formadas
fuente
Si desea comenzar a codificar Java a XML y XML a Java en menos de 5 minutos, pruebe la serialización XML simple. No pase horas aprendiendo la API JAXB http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Sin embargo, si está realmente interesado en aprender JAXB, aquí hay un excelente tutorial http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Contenido del tutorial:
JAXB para la serialización simple de Java-XML
Hay varias maneras de hacer la serialización XML en Java. Si desea un control detallado sobre el análisis y la serialización, puede optar por SAX, DOM o Stax para un mejor rendimiento. Sin embargo, lo que a menudo quiero hacer es un mapeo simple entre POJO y XML. Sin embargo, la creación de clases Java para realizar el análisis de eventos XML de forma manual no es trivial. Recientemente encontré que JAXB es un mapeo o serialización Java-XML rápido y conveniente.
JAXB contiene muchas características útiles, puede consultar la implementación de referencia aquí. El blog de Kohsuke también es un buen recurso para aprender más sobre JAXB. Para esta entrada de blog, le mostraré cómo hacer una simple serialización Java-XML con JAXB.
POJO a XML
Digamos que tengo un objeto Item Java. Quiero serializar un objeto Item a formato XML. Lo que tengo que hacer primero es anotar este POJO con algunas anotaciones XML del paquete javax.xml.bind.annotation. *. Consulte el listado de códigos 1 para Item.java
Del código
@XmlRootElement(name="Item")
indica que quiero ser el elemento raíz.@XmlType(propOrder = {"name", "price"})
indica el orden en que quiero que el elemento se organice en la salida XML.@XmlAttribute(name="id", ...)
indica que id es un atributo del elemento raíz.@XmlElement(....)
indica que quiero que el precio y el nombre sean elementos dentro del artículo.Mi
Item.java
esta listo. Luego puedo seguir adelante y crear un script JAXB para el artículo de cálculo de referencias.Para obtener una lista completa de códigos, consulte la Lista de códigos 2
main.java
. Seitem.xml
crea el archivo de salida del Listado de códigos 3 . Se parece a esto:Fácil verdad? Alternativamente, puede canalizar el XML de salida como String de texto, Stream, Writer, ContentHandler, etc. simplemente cambiando el parámetro del método marshal (...) como
XML a POJO
Vamos a revertir el proceso. Suponga que ahora tengo un fragmento de datos de cadena XML y quiero convertirlo en objeto Item.java. Los datos XML (Listado de código 3) se ven como
Entonces puedo deshacer este código xml al objeto Item por
Para obtener una lista completa de códigos, consulte la Lista de códigos 2 (main.java). La fuente XML puede venir en muchas formas, tanto de Stream como de archivo. La única diferencia, nuevamente, es el parámetro del método:
Validación con esquema XML
Lo último que quiero mencionar aquí es validar el XML de entrada con el esquema antes de desarmar al objeto Java. Creo un archivo de esquema XML llamado item.xsd. Para obtener una lista completa de códigos, consulte la Lista de códigos 4 (Item.xsd). Ahora lo que tengo que hacer es registrar este esquema para su validación.
Cuando intento descomponer datos XML en POJO, si el XML de entrada no se ajusta al esquema, se detectará una excepción. Para obtener una lista completa de códigos, consulte la Lista de códigos 5 (invalid_item.xml).
Aquí cambio el atributo 'id' a cadena en lugar de entero.
Si la entrada XML es válida contra el esquema, los datos XML se desarmarán al objeto Item.java con éxito.
fuente
Usando Eclipse IDE: -
fuente
La forma más fácil es usar la línea de comandos. Simplemente escriba en el directorio de su archivo .xsd:
Entonces, el Java generará todos los Pojos.
fuente
Maven se puede usar para este propósito, necesita agregar algunas dependencias y simplemente limpiar su aplicación. Obtendrá todas las clases creadas automáticamente en su carpeta de destino.
Simplemente cópielos del destino al lugar deseado, aquí está pom.xml que he usado para crear clasificados a partir de archivos xsd:
Simplemente coloque sus archivos xsd en "src / main / webapp / schemas /" y Maven los encontrará en tiempo de compilación.
Espero que esto te ayude, puedes encontrar más información en http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
Espero que ayude :)
fuente
No XSD files found. Please check your plugin configuration.
XMLBeans lo hará. Específicamente el comando "scomp".
EDITAR: XMLBeans se ha retirado , consulte esta publicación de stackoverflow para obtener más información.
fuente
Bueno, la mejor opción es
%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd
.También tengo una pregunta si tenemos una opción para hacer ingeniería inversa aquí. en caso afirmativo, ¿podemos generar xsd de la clase pojo?
fuente
Si no le importa usar una biblioteca externa, he usado Castor para hacer esto en el pasado.
fuente
Limitación de JAXB.
Trabajé en JAXB, según mi opinión, es una buena manera de tratar con datos entre objetos XML y Java. Los aspectos positivos son su mejor rendimiento y control sobre los datos durante el tiempo de ejecución. Con un buen uso de herramientas o scripts creados, se eliminarán muchos esfuerzos de codificación.
Descubrí que la parte de configuración no es una tarea inmediata, y pasé horas en la configuración del entorno de desarrollo.
Sin embargo, descarté esta solución debido a una limitación tonta que enfrenté. Mi definición de esquema XML (XSD) tiene un atributo / elemento con el nombre "valor" y que tengo que usar XSD tal como está. Esta muy pequeña restricción forzó el error de mi paso de enlace XJC con un error "Propiedad 'Valor' ya utilizado".
Esto se debe a la implementación de JAXB, el proceso de enlace intenta crear objetos Java a partir de XSD agregando pocos atributos a cada clase y uno de ellos es un atributo de valor. Cuando procesó mi XSD, se quejó de que ya hay una propiedad con ese nombre.
fuente
¿No es XJC de JAXB una posible respuesta a esto? Estoy tratando de lograr lo mismo. Sin embargo, todavía en la fase de "intento". Encontré XJC, así que pensé en compartir.
fuente
El conocido JAXB
Hay un complemento de Maven que podría hacer esto por usted en cualquier fase de compilación que desee.
Puede hacer esto de ambas maneras: xsd <-> Java
fuente
Hablando de la limitación de JAXB, una solución cuando se tiene el mismo nombre para diferentes atributos es agregar personalizaciones de jaxb en línea al xsd:
+
. . Declaraciones vinculantes. .
o personalizaciones externas ...
Puede ver más información en: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
fuente