2012-02-06 27 views
9

Tengo un esquema XML que contiene múltiples importaciones que a su vez contienen importaciones. Necesito generar un esquema semánticamente igual donde todas las importaciones están en línea. Quiero reemplazar éstos:Esquema XML: sustitución de importaciones con el esquema correspondiente

<xs:import namespace="http://some.name/" schemaLocation="./path/to/it.xsd"/> 

con el contenido de los esquemas de referencia. Y necesito obtener salida como una cadena, no como una representación interna.

Intenté Apache Xerces pero no encontré la manera de escribir XSModel en una cadena. ¿Esta ahí?

Intenté Apache XmlSchema 2 pero cuando escribe XML Schema, no reemplaza las declaraciones de importación con el esquema.

¿Hay alguna biblioteca que pueda hacerlo? ¿Alguna sugerencia?

Gracias.

+1

¿Por qué necesita hacer esto? –

+0

Es una larga historia, y esta es una posible solución para un problema que tengo – Thresh

Respuesta

10

xsd: include generalmente puede estar en línea, pero xsd: import no. Esto se debe a que xsd: import se usa para hacer referencia a un documento de esquema para un espacio de nombres de destino diferente, y no puede tener componentes con espacios de nombres de destino diferentes en el mismo documento de esquema.

5

Como se señala here y here, la limitación de XSD de tener un espacio de nombres de destino por archivo hace que su solicitud "semánticamente equivalente" sea imposible de resolver. Esto es cierto, y también típico, en todos los escenarios donde el espacio de nombres se usa para definir límites de (o refinar) conjuntos semánticos.

Para la refactorización de tiempo o tiempo de diseño, donde no tiene que lidiar programáticamente con tal cosa de forma recurrente o dinámica, también puede intentar echar un vistazo here; Tal vez el problema en su caso no es que las importaciones no sean compatibles (lo que me parecería extraño), sino más bien que la complejidad de incluir/importar hace que el gráfico sea demasiado complicado para su herramienta. Como se muestra en la última publicación, al colapsar los elementos incluidos, con un efecto neto de reducción del número de importaciones requeridas, se resolvió el problema.

Alternativamente, si de alguna manera su "equivalencia semántica" no incluye espacios de nombres (por ejemplo, he visto personas que estaban bastante interesadas en desarrollar un modelo relacional de XSD), puede ser posible, mediante refactorización, espacios de nombres en uno (o ninguno, es decir, sin espacio de nombres de destino) y luego alimentarlo a su herramienta. La única pega aquí, desde una perspectiva de refactorización automática, es garantizar que no haya componentes XSD denominados duplicados en diferentes espacios de nombres; p.ej. no puede tener el mismo nombre para un elemento, o tipo, o atributo, o grupo, etc. en diferentes espacios de nombres.