2010-03-07 19 views
5

he creado el servicio web simple en C#:Cómo compilar un esquema que usa un DataSet (xs: schema)?

public void AddData(DataSet ds) 

El esquema generado (WSDL) tiene el siguiente aspecto:

<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema"> 
... 
<s:element ref="s:schema" /> 
... 
</s:schema> 

Nota del esquema no contiene ninguna importación/incluir elementos.

Estoy tratando de cargar este esquema para aC# System.Xml.XmlSchema y añadirlo a System.Xml.XmlSchemaSet:

var set = new XmlSchemaSet(); 
var fs = new FileStream(@"c:\temp\schema.xsd", FileMode.Open); 
var s = XmlSchema.Read(fs, null); 
set.Add(s);    
set.Compile(); 

La última línea de tiros esta excepción:

The 'http://www.w3.org/2001/XMLSchema:schema' element is not declared. 

Tiene sentido: el esquema generado por .Net usa el tipo "s: schema" que se declara en un esquema que no se importa.

  1. ¿Por qué .Net crea un esquema no válido?
  2. ¿Cómo compilar el esquema de todos modos? Lo que hice fue descargar el esquema en http://www.w3.org/2001/XMLSchema y también lo agregué al XmlSchemaSet. Esto no funcionó ya que ese esquema en línea contiene definición DTD. Tuve que eliminarlo manualmente y ahora todo funciona. ¿Tiene sentido o me falta algo?

Respuesta

2
  1. Lo llamaría un error. Aunque es muy raro ver un esquema XML haciendo referencia a los elementos del espacio de nombres http://www.w3.org/2001/XMLSchema.
  2. Lo que hizo es la manera correcta, casi; en general, debería poder compilar un archivo de esquema XML que use una referencia DOCTYPE; solo asegúrese de que la DTD esté disponible en la ubicación especificada (o disponible a través de una resolución XML) y la configuración de su lector esté configurada para no prohibir el procesamiento DTD (ya sea las propiedades ProhibitDtd o DtdProcessing obsoletas en XmlReaderSettings, de manera predeterminada son verdaderas).
-1

Esto significa que el servicio no tiene suficiente información para construir un formato significativo para los elementos por lo que genera un WSDL esencialmente diciendo "Voy a enviar algún tipo XML, pero no sé lo que se verá me gusta." Necesitamos construir la estructura del servicio un poco más para que el generador WSDL pueda crear un esquema significativo.

+0

No, significa que el servicio devuelve un 'DataSet'. Esa no es una buena idea. ¿Cómo se esperaría que un cliente Java maneje un 'DataSet'. En general, no utilice ningún tipo específico de .NET en el contrato de un servicio web. –

Cuestiones relacionadas