validar - Generar clases de Java a partir de archivos.XSD...?
validate xsd java example (13)
¿No es el XJC de JAXB una posible respuesta a esto? Estoy tratando de lograr lo mismo. Aún en la fase de "prueba" sin embargo. Encontré XJC, así que pensé en compartir.
Tengo un gigantesco archivo de esquema QuickBooks SDK .XSD que define solicitudes / respuestas XML que puedo enviar / recibir de QuickBooks.
Me gustaría poder generar fácilmente clases Java a partir de estos archivos .XSD, que luego podría usar para ordenar objetos XML a 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 ...
El conocido JAXB
Hay un complemento maven que podría hacer esto por usted en cualquier fase de compilación que desee.
Podrías hacer esto en ambos sentidos: xsd <-> Java
Hablando de la limitación JAXB, una solución al tener el mismo nombre para diferentes atributos es agregar personalizaciones jaxb en línea a la xsd:
+
. . declaraciones vinculantes. .
o personalizaciones externas ...
Puedes ver más información en: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
JAXB Limitación.
Trabajé en JAXB, según mi opinión es una buena forma de tratar los datos entre objetos XML y Java. Los lados positivos están comprobados y son mejores en rendimiento y control sobre los datos durante el tiempo de ejecución. Con un buen uso de herramientas o scripts integrados, se eliminarán muchos esfuerzos de codificación.
Encontré que la parte de configuración no es una tarea directa, y pasé horas en obtener la configuración del entorno de desarrollo.
Sin embargo, abandoné 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 tengo que usar XSD tal como está. Esta muy pequeña restricción obligó a mi enlace de enlace XJC falló con un error "Propiedad ''Valor'' ya utilizado".
Esto se debe a la implementación de JAXB, el proceso de enlace intenta crear objetos de Java a partir de XSD agregando algunos 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.
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í. Si es así, ¿podemos generar xsd de la clase pojo?
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.
Solo cópielos del objetivo al lugar deseado, aquí está pom.xml que he usado para crear classed desde archivos xsd:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/webapp/schemas/</schemaDirectory>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Simplemente coloque sus archivos xsd bajo "src / main / webapp / schemas /" y maven los encontrará en tiempo de compilación.
Espero que esto te ayude, se puede encontrar más información en http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
Espero que ayude :)
Para ampliar los comentarios "usar JAXB" arriba,
En Windows "%java_home%/bin/xjc" -p [your namespace] [xsd_file].xsd
por ejemplo, "%java_home%/bin/xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
Espere un poco, y si tiene un archivo XSD bien formado, obtendrá algunas clases de Java bien formadas
Si desea comenzar a codificar Java a XML y XML a Java en menos de 5 minutos, intente con Serialización Simple XML. No dedique horas a aprender la API de JAXB
Sin embargo, si está realmente interesado en aprender JAXB, aquí hay un excelente tutorial
Contenido del tutorial:
JAXB para la serialización Java-XML simple
Hay una serie de forma 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 obtener 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 manualmente no es trivial. Recientemente descubrí que JAXB es una asignación o serialización Java-XML rápida y conveniente.
JAXB contiene muchas funciones ú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 Java Item. 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. *. Vea el código listado 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 salida XML. -
@XmlAttribute(name="id", ...)
indica que id es un atributo del elemento raíz. -
@XmlElement(....)
indica que deseo que el precio y el nombre sean elementos dentro del artículo.
Mi Item.java
está listo. Luego puedo seguir y crear un script JAXB para ordenar el artículo.
//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));
Para obtener el listado completo del código, consulte el Listado de Código 2 main.java
. Se item.xml
archivo de salida item.xml
Listado de Código 3. Se parece a esto:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
Fácil, ¿verdad? Alternativamente puede canalizar el XML de salida como texto String, Stream, Writer, ContentHandler, etc. simplemente cambie el parámetro del método mariscal (...) como
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);
XML a POJO
Vamos a revertir el proceso. Supongamos que ahora tengo una parte de datos de cadena XML y quiero convertirlo en objeto Item.java. Los datos XML (listado de código 3) se parecen a
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>
A continuación, puedo desasignar este código xml al objeto Item por
...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...
Para el listado completo del código, consulte el Listado de Código 2 (main.java). La fuente XML puede venir en muchas formas tanto de Stream como de archivo. La única diferencia, de nuevo, es el parámetro del método:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
Validación con esquema XML
Lo último que quiero mencionar aquí es validar el XML de entrada con el esquema antes de desasignar el objeto Java. Creo un archivo de esquema XML llamado item.xsd. Para obtener el listado completo del código, consulte el Listado de Código 4 (Item.xsd). Ahora lo que tengo que hacer es registrar este esquema para la validación.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
Cuando trato de eliminar los datos XML de POJO, si el XML de entrada no se ajusta al esquema, se detectará una excepción. Para obtener el listado completo del código, consulte el Listado de Código 5 (invalid_item.xml).
javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: ''item1'' is
not a valid value for ''integer''.]
Aquí cambio el atributo ''id'' a cadena en lugar de entero.
Si la entrada XML es válida frente al esquema, los datos XML se desmarcarán al objeto Item.java correctamente.
Si no te importa usar una biblioteca externa, he usado Castor para hacer esto en el pasado.
Usando Eclipse IDE: -
- copie el xsd en un proyecto nuevo / existente.
- Asegúrate de que JAXB requiere JAR en tu classpath. Puedes descargar uno here .
- Haga clic derecho en el archivo XSD -> Generar -> clases JAXB.
la forma más fácil es usar la línea de comando. Simplemente escriba el directorio de su archivo .xsd:
xjc myFile.xsd.
Entonces, Java generará todos los Pojos.
JAXB hace EXACTAMENTE lo que quieres. Está integrado en el JRE / JDK a partir de 1.6
XMLBeans lo hará. Específicamente el comando "scomp".
EDITAR: XMLBeans ha sido retired , verifique esta publicación de para obtener más información.