validate validar example con against java xml xsd
here

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: -

  1. copie el xsd en un proyecto nuevo / existente.
  2. Asegúrate de que JAXB requiere JAR en tu classpath. Puedes descargar uno here .
  3. 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