2009-03-26 13 views
24

Tengo un archivo .xsd que utilizo para generar código con la herramienta xsd.exe de Visual Studio. Algunos miembros de la clase son Guids y la herramienta xsd.exe proporciona 2 advertencias:¿Cuál es la forma correcta de usar el tipo Guid en un archivo XSD?

El espacio de nombre 'http://microsoft.com/wsdl/types/' no está disponible para ser referenciado en este esquema. No se ha declarado el tipo 'http://microsoft.com/wsdl/types/:guid'.

El tipo de Guid se reconoce porque el archivo C# generado es válido y funciona. ¿Alguien sabe cómo deshacerse de esas advertencias?

¿Cuál es la sintaxis correcta para que se valide XSD Y se generen miembros de clase como System.Guid?

Respuesta

40

Gracias a todos, he encontrado cómo quitar las advertencias.

Como sysrqb dijo, el espacio de nombres wsdl ha sido eliminado o nunca existió. Parece que la herramienta xsd.exe conoce internamente la definición de Guid, pero no puede validar el esquema xsd.

Como se mencionó en boj, la única manera de validar el esquema con Guids en él es (re) definir ese tipo en un esquema. El truco aquí es agregar el tipo Guid al mismo espacio de nombres "http://microsoft.com/wsdl/types". De esta manera, el xsd.exe hará la asociación correcta entre http://microsoft.com/wsdl/types:Guid y System.Guid

hice un nuevo archivo XSD para el tipo GUID:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://microsoft.com/wsdl/types/" > 
    <xs:simpleType name="guid"> 
     <xs:annotation> 
      <xs:documentation xml:lang="en"> 
       The representation of a GUID, generally the id of an element. 
      </xs:documentation> 
     </xs:annotation> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="\{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\}"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

Luego, corro xsd.exe tanto con mi archivo xsd original y este nuevo archivo xsd:

xsd.exe myschema.xsd guid.xsd /c 
+2

Tuve que usar '' '' '' además de '' 'xmlns: wsdl = "http://microsoft.com/wsdl/types/" '' 'en mi esquema para que valide. – Sense545

+0

Pulso 'Error: Tipo de referencia {http://microsoft.com/wsdl/types/}guid was not found' tratando de usar scalaxb.org/online para generar un wsdl de equipos .Net en scala. Acabo de agregar el xsd en esta respuesta a la solución y generó todas las clases de Scala bien. ¡Gracias! – simbo1905

1

Parece que se eliminó la página de extensión del espacio de nombres wsdl, por lo que no puede encontrar la información de tipo que necesita.

3

Cita de here:

XmlSchema guidSchema = new XmlSchema(); 
    guidSchema.TargetNamespace = "http://microsoft.com/wsdl/types/"; 

    XmlSchemaSimpleTypeRestriction guidRestriction = new XmlSchemaSimpleTypeRestriction(); 
    guidRestriction.BaseTypeName = new XmlQualifiedName("string", XmlSchema.Namespace); 

    XmlSchemaPatternFacet guidPattern = new XmlSchemaPatternFacet(); 
    guidPattern.Value = @"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"; 
    guidRestriction.Facets.Add(guidPattern); 

    XmlSchemaSimpleType guidType = new XmlSchemaSimpleType(); 
    guidType.Name = "guid"; 
    guidType.Content = guidRestriction; 
    guidSchema.Items.Add(guidType); 

    schemaSet.Add(guidSchema); 

    XmlSchema speakerSchema = new XmlSchema(); 
    speakerSchema.TargetNamespace = "http://www.microsoft.com/events/teched2005/"; 

    // ... 

    XmlSchemaElement idElement = new XmlSchemaElement(); 
    idElement.Name = "ID"; 

    // Here's where the magic happens... 

    idElement.SchemaTypeName = new XmlQualifiedName("guid", "http://microsoft.com/wsdl/types/"); 
+1

Gracias, como yo lo entiendo, tengo que rodar mi propio esquema para el tipo Guid para replicar lo que el espacio de nombres WSDL. Este es el código de C# sin embargo, ¿cómo pongo esto en mi archivo XSD para que xsd.exe pueda leerlo? – erbi

+0

Creo que no se puede extender xsd.exe de esta manera. Pero puede generar esquema con .NET, sin xsd.exe basado en este fragmento de código. O, otras alternativas de xsd.exe: http://www.hitsw.com/xml_utilites/ Buscaré en Google la implementación completa de .NET. – boj

Cuestiones relacionadas