2010-03-26 26 views
7

Utilizzo un servizio Web di terze parti la cui definizione e implementazione non sono sotto il mio controllo. Questo servizio Web cambierà in futuro.Estrazione automatica XSD in linea da WSDL in file XSD

Il servizio Web deve essere utilizzato per generare un file XML che contiene alcuni degli stessi dati (rappresentati dagli stessi tipi XSD) del servizio Web più alcune informazioni aggiuntive generate dal programma.

Il mio approccio:

  1. creare il mio XSD riferimento alle definizioni XSD del WSDL del chiamato servizio web
  2. utilizzare un Java (Questo XSD include anche tipi XSD per le informazioni aggiuntive, ovviamente.) quadro associazione dati XML (come ADB o JiXB) per generare le classi di associazione dati dal mio file XSD dal passo 1
  3. utilizzare un framework SOAP Java (come Axis2 o CXF) con lo stesso quadro associazione dati per generare le classi di associazione dati dal WSDL (Questo mi permetterebbe di usare gli oggetti recuperati dal servizio web direttamente nei generati su XML.)

I tipi XSD che sto per utilizzare nel mio file XSD, ma sono definiti nel WSDL, sono soggetti a modifiche. Ogni volta che cambiano, mi piacerebbe elaborare di nuovo automaticamente il database XSD e WSDL. (Se il cambiamento è abbastanza significativo, questo potrebbe innescare un certo sforzo di sviluppo (ma di solito non)..)

Il mio problema:

Nel passaggio 1 Ho bisogno di un XSD riferendosi agli stessi tipi usati per il Web Servizio.

Il WSDL fa riferimento a un altro WSDL, che si riferisce a un altro WSDL, ecc. Infine esiste un WSDL con i tipi XSD in linea necessari. Per quanto ne so non c'è modo di fare direttamente riferimento ai tipi XSD in linea di un WSDL da un XSD.

L'approccio che ritengo più fattibile è includere un passaggio aggiuntivo nell'elaborazione automatica (prima del collegamento dati) che estrae l'XSD in linea dal WSDL in altri file XSD. Questi altri file XSD possono quindi essere indirizzati dal mio file XSD.

Le cose che mi piacerebbe evitare:

  • Copiare manualmente incollando il XSD inline in un file XSD
  • Eventuali passaggi manuali (come la determinazione della (Cerco un processo automatico.). WSDL che contiene manualmente i tipi in linea. (Anche la posizione di tale WSDL cambia).)
  • Utilizzo di xsd: any in my own XSD. Vorrei che il mio file XSD fosse corretto.
  • Utilizzando una tecnologia non-Java (come NET)
  • Enormi quantità di attuazione (ma suggerimenti su come si potrebbe implementare un tale estrazione sono i benvenuti in ogni caso)

PS: Ho trovato alcune domande simili, ma tutti hanno avuto risposte del tipo: WTH, vuoi farlo? Questa è la ragione della mia storia di fondo piuttosto ampia.

risposta

3

Non conosco librerie che facciano questo per voi, ma è definitivamente possibile implementare con un po 'di sforzo (~ 200 linee).Un ruvido meta-programma per generare tutti in linea e incluso XSD:

method processWSDL(Document wsdl) { 
    for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) { 
     call processXSD("inline_[i].xsd",".") 
    } 
    for each ("/wsdl:definitions/wsdl:import" in wsdl) { 
     Document x = read and parse ("@location") 
     if (x is WSDL) call processWSDL(x) 
     else if (x is XSD) call processXSD("@location", x) 
    } 
} 

method processXSD(String filename, Document xsd) { 
    write "xsd" to a new file "filename" // if 'filename' is a URL, take only the part after the last '/' 
    for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) { 
     if ("@schemaLocation" is local reference) {  // no 'http://' prefix 
      Document x = read and parse ("@schemaLocation") 
      call processXSD("@schemaLocation", x) 
     } 
    } 
} 

Non è una soluzione completa, per esempio non gestisce i prefissi dei namespace definiti al di fuori dello schema inline, ma si spera che dia un buon punto di partenza.

+0

ho già capito che sarebbe stato necessario qualcosa di simile. Mi è stato effettivamente speravo in qualcosa di più simile quadro: ** per (XmlSchema XmlSchema: wsdl.extractNamespaceSchemas()) xmlSchema.writeFile (ns2FileName (xmlSchema.getTargetNamespace())); ** Aah, un mondo imperfetto ... –

+0

@Steven : suona come un'opportunità per un progetto open source per portare il mondo un po 'più vicino alla perfezione ;-) –

2

solo per mantenere questo messaggio in questione, le cose sono cambiate da quando la risposta è stata accettata. È ora possibile in Java generare ciò che vuoi a partire da WSDL; JAX-WS fornisce lo strumento wsimport che fa esattamente ciò che viene richiesto: prendere il WSDL, creare un proxy client insieme a un gruppo di classi annotate JAXB per un/marshalling delle richieste.

Direi però, al punto di @MoizTankiwala, che la necessità di esportare il contenuto XSD da WSDL (o di includere tutto il contenuto XSD esterno nella sezione dei tipi di un WSDL) è viva e vegeta.

Il primo è qualcosa che ha senso quando qualcuno ha un grande corpo di XSD, e c'è una preoccupazione generale per quanto riguarda la gestione efficace, l'analisi e l'evoluzione di quel modello in XSD.

Quest'ultimo è anche ricercato dal momento che alcuni (soprattutto) i linguaggi dinamici manca ancora il supporto in piena regola da utensili quando si tratta di WSDL per la generazione di proxy lato client.

miei other answer on SO parla di una simile esigenza, che dovrebbero aiutare almeno la richiesta di Moiz ...