2012-01-23 33 views
5

He estado buscando por la red durante unas pocas horas, tratando de encontrar una manera simple de validar un mensaje SOAP completo contra un WSDL. Soy consciente de que hay formas de hacerlo con los diversos marcos de servicios web, pero no quiero hacerlo, ya que el requisito es simplemente validar un fragmento de XML. Podría validar contra el esquema, aunque el problema que tengo es que hay una cantidad de esquemas importados en el WSDL y no sé con cuál debo estar validando. Podría escribir alguna utilidad para procesar primero el WSDL y la respuesta para determinar con qué XSD validar, pero supuse que esto podría hacerse como una línea usando una biblioteca establecida.Validación del mensaje SOAP contra WSDL con múltiples XSD's

¿Alguien sabe de una forma relativamente sencilla de validar un documento XML dado un WSDL y múltiples XSD?

Respuesta

4

En un proyecto anterior, resolví este problema analizando el archivo WSDL y extrayendo los esquemas de él. El código era algo así como lo siguiente, supone que el WSDL se ha leído en la variable Fuente "wsdlSource" de alguna manera y que los espacios de nombres importados se declaran en el elemento "schema". Probablemente sería una buena idea hacer esto una vez al inicio y luego hacer la validación en un manejador SOAP.

//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

¡Parece el único enfoque por ahora! Gracias por el fragmento. – Ellis

0

No hay una manera directa de hacerlo. No hay una biblioteca de código abierto que pueda encontrar tampoco. Usé la herramienta XML Pack en IBM Info sphere para hacer esto. Esto hace un trabajo bastante bueno para importar wsdls y xsds y validar datos xml o cargar datos XML y convertirlos en archivos planos. Puede encontrar este enlace útil: http://www.ibm.com/developerworks/data/library/techarticle/dm-1103datastages/index.html

+0

Gracias por la respuesta, aunque yo no creo que esto va a volar dado que lo que estoy tratando de hacer aquí es simplificar una utilidad que actualmente utiliza un marco completo soplado para validar un mensaje SOAP – Ellis

+0

Se trata de una biblioteca que hemos utilizado: http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html en nuestra implementación actual. – codegenx

+0

No veo nada sobre la validación en contra de un WSDL en esa página. – Ellis