2012-02-06 17 views
9

Ho uno schema XML che contiene più importazioni che a loro volta contengono importazioni. Ho bisogno di generare uno schema semanticamente uguale dove tutte le importazioni sono in linea. Voglio sostituirli:Schema XML: sostituzione delle importazioni con lo schema corrispondente

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

con il contenuto di schemi di riferimento. E ho bisogno di ottenere l'output come una stringa, non come una rappresentazione interna.

Ho provato Apache Xerces ma non ho trovato un modo per scrivere XSModel su una stringa. È lì?

Ho provato Apache XmlSchema 2 ma quando scrive XML Schema non sostituisce le dichiarazioni di importazione con lo schema.

C'è qualche libreria che può farlo? Eventuali suggerimenti?

Grazie.

+1

Perché hai bisogno di fare questo? –

+0

È una lunga storia e questa è una possibile soluzione per un problema che ho – Thresh

risposta

10

xsd: include solitamente può essere inline, ma xsd: import non può. Questo perché xsd: import viene utilizzato per fare riferimento a un documento dello schema per un diverso spazio dei nomi di destinazione e non è possibile avere componenti con spazi dei nomi di destinazione diversi nello stesso documento dello schema.

5

Come indicato in here e here, la limitazione di XSD di avere uno spazio dei nomi di destinazione per file rende impossibile la risoluzione della richiesta "semanticamente equivalente". Questo è vero, e anche tipico, in tutti gli scenari in cui lo spazio dei nomi stesso è usato per definire i confini di (o perfezionare) gli insiemi semantici.

Per il refactoring di una sola volta o in fase di progettazione, in cui non è necessario programmare in modo programmatico una cosa del genere in modo ricorrente o dinamico, è possibile provare a dare un'occhiata a here; Forse il problema nel tuo caso non è che le importazioni non sono supportate (cosa che troverei strana), ma piuttosto che la complessità delle inclusioni/importazioni rende il grafico troppo complicato per i tuoi strumenti. Come mostrato nell'ultimo post, comprimendo gli include, con un effetto netto di riduzione del numero di importazioni richieste, il problema è stato risolto.

In alternativa, se in qualche modo la tua "equivalenza semantica" non coinvolge spazi dei nomi (ad esempio ho visto persone che erano piuttosto interessate a sviluppare un modello relazionale da XSD), potrebbe essere possibile, attraverso il refactoring, portare tutto spazi dei nomi in uno (o nessuno cioè nessun spazio dei nomi di destinazione) e poi alimentarlo al tuo strumento. L'unica presa qui, da una prospettiva di refactoring automatico, è quella di garantire che non vi siano duplicati di componenti XSD denominati su diversi namespace; per esempio. non può avere lo stesso nome per un elemento, o tipo, o attributo, o gruppo, ecc. in diversi spazi dei nomi.

Problemi correlati