2010-03-26 81 views
7

Estoy utilizando un servicio web de terceros cuya definición e implementación están fuera de mi control. Este servicio web cambiará en el futuro.Extracción automática de XSD en línea de WSDL en archivo (s) XSD

El servicio web se debe utilizar para generar un archivo XML que contenga algunos de los mismos datos (representados por los mismos tipos XSD) que el servicio web más alguna información adicional generada por el programa.

Mi enfoque:

  1. crear mi propia XSD en referencia a las definiciones XSD del WSDL de la llamada de servicio web
  2. utilizar un Java (Este XSD también incluye tipos XSD para la información adicional, obviamente). XML databinding framework (como ADB o JiXB) para generar las clases de enlace de datos de mi propio archivo XSD desde el paso 1
  3. utilizan un marco Java SOAP (como Axis2 o CXF) con el mismo marco de enlace de datos para generar las clases de enlace de datos del WSDL (Esto me permitiría usar los objetos recuperados por el servicio web directamente en la generati en el XML.)

Los tipos de XSD que voy a utilizar en mi propio archivo XSD, pero están definidos en el WSDL, están sujetos a cambios. Cada vez que cambian, me gustaría procesar automáticamente el enlace de datos XSD y WSDL nuevamente. (Si el cambio es bastante significativo, esto podría desencadenar un cierto esfuerzo de desarrollo (Pero por lo general no)..)

Mi problema:

En el paso 1 Necesito un XSD en referencia a los mismos tipos y usadas por la Web Servicio.

El WSDL se refiere a otro WSDL, que se refiere a otro WSDL, etc. Finalmente, hay un WSDL con los tipos de XSD en línea necesarios. Hasta donde sé, no hay forma de referenciar directamente los tipos XSD en línea de un WSDL de un XSD.

El enfoque que yo consideraría más viable es incluir un paso adicional en el procesamiento automático (antes del enlace de datos) que extraiga el XSD en línea del WSDL en otro (s) archivo (s) XSD. Estos otros archivos XSD pueden ser referidos por mi propio archivo XSD.

Cosas que me gustaría evitar:

  • copiar manualmente pegando el XSD en línea en un archivo XSD
  • Cualquier pasos manuales (igual que la determinación de la (Busco a un proceso automático.). WSDL que contiene los tipos en línea manualmente. (La ubicación de ese WSDL también cambia).)
  • Usando xsd: any en mi propio XSD. Me gustaría que mi propio archivo XSD sea correcto.
  • Usando una tecnología no Java (como .NET)
  • Enormes cantidades de aplicación (pero consejos sobre cómo llevaría a cabo una extracción tales son bienvenidos todos modos)

PD: He encontrado algunas preguntas similares, pero todos tuvieron respuestas como: ¿WTH te gustaría hacer eso? Esa es la razón de mi gran historia de fondo.

Respuesta

3

No conozco ninguna biblioteca que pueda hacer esto por usted, pero definitivamente es posible implementarlo con un poco de esfuerzo (~ 200 líneas).Un meta-programa áspera para generar todas inline e incluyó XSDs:

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) 
     } 
    } 
} 

No es una solución completa, por ejemplo, no maneja los prefijos del espacio de nombres definidos fuera del esquema en línea, pero con un buen punto de partida.

+0

que ya supuso que algo como esto sería necesario. Realmente estaba esperando algo más como: ** para (XmlSchema xmlSchema: wsdl.extractNamespaceSchemas()) xmlSchema.writeFile (ns2FileName (xmlSchema.getTargetNamespace())); ** Aah, un mundo imperfecto ... –

+0

@Steven : suena como una oportunidad para un proyecto de código abierto para acercar el mundo un poco más a la perfección ;-) –

2

Solo para mantener esta publicación relevante, las cosas han cambiado desde que se aceptó una respuesta. Ahora es posible en Java generar lo que desee a partir de WSDL; JAX-WS proporciona la herramienta wsimport que hace exactamente lo que se solicita: tomar el WSDL, crear un proxy de cliente junto con un grupo de clases anotadas por JAXB para unificar las solicitudes.

Diría, sin embargo, al punto de @MoizTankiwala, que la necesidad de exportar contenido XSD desde WSDL (o incluir todo el contenido XSD externo dentro de una sección de tipos WSDL) está vivo y en buen estado.

Lo primero es algo que tiene sentido cuando alguien tiene un gran cuerpo de XSD, y existe una preocupación general con respecto a la gestión efectiva, el análisis y la evolución de ese modelo en XSD.

Esto último también es buscado, ya que algunos lenguajes (principalmente) dinámicos aún carecen de soporte total de las herramientas cuando se trata de WSDL para la generación de proxy del lado del cliente.

Mis other answer on SO habla de una necesidad similar, que deben ayudar al menos a la petición de Moiz ...