manejo archivos java xml xsd jaxb

manejo - ¿Cómo manejar diferentes versiones de archivos xsd en una aplicación java?



manejo de archivos xml en java (1)

En primer lugar, necesita alguna forma de identificar el esquema apropiado para el documento de instancia particular. Usted dice que los documentos tienen un atributo schemaLocation , por lo que esta es una solución. Sin embargo, tenga en cuenta que debe configurar específicamente el analizador para usar este atributo, y un documento malicioso podría especificar una ubicación de esquema que no controle. En cambio, recomendaría obtener el valor del atributo y usarlo para encontrar el esquema apropiado en una tabla interna.

El siguiente es el acceso a los datos. No dices por qué estás usando tres esquemas diferentes. La única razón racional es una especificación de datos en evolución (es decir, los esquemas representan las versiones 1, 2 y 3 de los mismos datos). Si esa no es su razón, entonces debe reconsiderar su diseño.

Si intenta soportar una especificación de datos en evolución, entonces debe responder la pregunta "¿cómo trato los datos que faltan?". Hay un par de respuestas a esto: una es mantener múltiples versiones del código. Con la refacturación de funcionalidades comunes, esta no es una mala idea, pero puede volverse fácilmente inmanejable.

La alternativa es usar una única base de código y algún tipo de objeto adaptador que incorpore sus reglas. Y si sigues este camino, JAXB es la solución incorrecta, ya que está vinculada a un esquema. Es posible que pueda usar un conversor permisivo XML-> Java: creo que XStream funcionará, y sé que la versión 1.1 de Practical XML funcionará (desde que lo escribí), aunque tendría que compilarlo usted mismo.

Otra mejor alternativa, dependiendo de la complejidad del esquema, es desarrollar un conjunto de objetos que usan XPath para recuperar los datos. Probablemente implementaría el uso de un objeto "maestro" que contenga expresiones XPath para cada campo, en cada variante del esquema. Luego cree objetos "envoltura" livianos que contengan una versión DOM de su documento de instancia y use el XPath apropiado para el esquema. Sin embargo, tenga en cuenta que esto es limitado para el acceso de solo lectura.

Los hechos

En mi aplicación java, tengo que manejar archivos XML con diferentes versiones de esquema (archivos xsd) simultáneamente. El contenido de los archivos XML cambió solo un poco entre las diferentes versiones, por lo que me gustaría usar principalmente el mismo código para manejarlo y simplemente hacer algunas disquetes de casos dependiendo de la versión del esquema utilizado.

Solución actual

En este momento estoy analizando los archivos XML con un analizador SAX y mi propio ContentHandler ignorando la versión del esquema y simplemente comprobando si las etiquetas que necesito para el procesamiento están presentes.

Alternativa posible

Realmente me gustaría usar JAXB para generar las clases para analizar los archivos XML. De esta forma, podría eliminar todas las cadenas codificadas (constantes) de mi código Java y manejarlas con las clases generadas.

Pregunta (s)

  • ¿Cómo puedo manejar diferentes versiones de esquema de una manera unificada usando JAXB?
  • ¿Hay una mejor solución?

Progreso

Recopilé las versiones de esquema en diferentes paquetes v1, v2 y v3. Ahora puedo crear un Unmarshaller esta manera:

JAXBContext jc = JAXBContext.newInstance( v1.Root.class, v2.Root.class, v3.Root.class ); Unmarshaller u = jc.createUnmarshaller();

Ahora u.unmarshal( xmlInputStream ); me da la clase Root del paquete que coincide con el esquema del archivo XML.

A continuación, intentaré definir una interface para acceder a las partes comunes de los esquemas. Si has hecho algo así antes, házmelo saber . Mientras tanto estoy leyendo las especificaciones de JAXB ...