2012-01-23 13 views
5

Ho guardato intorno alla rete per un buon paio di ore ora, cercando di trovare un modo semplice per convalidare un messaggio SOAP completo contro un WSDL. Sono consapevole del fatto che ci sono modi per farlo con i vari framework Web Service disponibili, ma non voglio farlo perché il requisito è semplicemente quello di convalidare un pezzo di XML. Potrei convalidare contro lo schema, anche se il problema che ho è che ci sono un certo numero di schemi importati nel WSDL e non so su quale debba essere convalidato. Potrei scrivere qualche utilità per elaborare prima il WSDL e la risposta per determinare quale XSD convalidare, ma presumevo che questo potesse essere fatto come un one-liner usando una libreria stabilita!Convalida messaggio SOAP contro WSDL con più XSD

Qualcuno sa di un modo relativamente semplice per convalidare un documento XML dato un WSDL e più XSD?

risposta

4

In un progetto precedente ho risolto questo problema analizzando il file WSDL e estraendo gli schemi da esso. Il codice era simile al seguente, presuppone che il WSDL sia stato letto nella variabile Source "wsdlSource" in qualche modo e che gli spazi dei nomi importati siano dichiarati nello schema "-element". Probabilmente sarebbe una buona idea eseguirlo una volta all'avvio e quindi eseguire la convalida in un SOAPHandler.

//First create a document from the WSDL-source 
    DocumentBuilder db = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder(); 
    Document wsdlDoc = db.newDocument(); 

    TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    transformer.transform(wsdlSource, new DOMResult(wsdlDoc)); 

    //Now get the schemas from the WSDL 
    NodeList schemaNodes = wsdlDoc.getElementsByTagNameNS(
      XMLConstants.W3C_XML_SCHEMA_NS_URI, "schema"); 

    int nrSchemas = schemaNodes.getLength(); 

    Source[] schemas = new Source[nrSchemas]; 

    for (int i = 0; i < nrSchemas; i++) { 
     schemas[i] = new DOMSource(schemaNodes.item(i)); 
    } 

    SchemaFactory schemaFactory = SchemaFactory 
      .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

    //Now we have a schema that can validate the payload 
    Schema schema = schemaFactory.newSchema(schemas); 
    Validator validator = schema.newValidator(); 
+0

Sembra l'unico approccio per ora! Grazie per il frammento. – Ellis

0

Non c'è un modo semplice per farlo. Non esiste una libreria open source che sia stata in grado di trovare. Ho usato lo strumento pacchetto XML nella sfera informazioni IBM per farlo. Questo è un buon lavoro per importare wsdls e xsds e validare dati xml o caricare dati XML e convertirli in file flat. Questo link può essere utile: http://www.ibm.com/developerworks/data/library/techarticle/dm-1103datastages/index.html

+0

Grazie per la risposta, anche se io non credo che questo volerà dato che quello che sto cercando di fare qui è di semplificare un programma di utilità che attualmente utilizza un framework in piena regola per convalidare un messaggio SOAP – Ellis

+0

Si tratta di un libreria che abbiamo usato: http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html nella nostra attuale implementazione. – codegenx

+0

Non vedo nulla sulla convalida di un WSDL su quella pagina. – Ellis