2010-11-10 4 views
7

Quiero generar un esquema XML basado en una clase, del mismo modo que puede hacerlo con con Xsd.exe tool.¿Utiliza programáticamente la característica de la herramienta XSD.exe (genera el esquema de la clase) a través de las clases de .NET Framework?

E.g. xsd.exe /type: typename /outputdir:c:\ assmeblyname.

¿Hay una manera de hacer esto mediante el uso de clases en .NET Framework en lugar de utilizar la herramienta independiente?

Estoy seguro de que he visto información sobre referencias de tareas o similar, es decir, algo programático, que se puede usar en lugar de algunas de estas utilidades independientes o que algunas utilidades independientes obtienen sus características a través de FCL o Microsoft. API.

+0

No es que esté al tanto de (como una clase de una sola vez con un ' Método GenerateXsd() '). Pero puede, con una buena cantidad de grasa, recrearlo con varias clases de System.Reflection y System.Xml. –

+0

Hmmmmm ... gracias JesseC. ¿Alguien sabe de algo de esta grasa prefabricada en Internet? –

+0

No es lo que está buscando, pero podría envolver la herramienta. Si se trata de una herramienta .NET, también podría hacer referencia al exe y codificar el código. –

Respuesta

1

encontrado este que parece que debe hacer el truco ...

public static string GetSchema<T>() 
    { 
     XmlAttributeOverrides xao = new XmlAttributeOverrides(); 
     AttachXmlAttributes(xao, typeof(T)); 

     XmlReflectionImporter importer = new XmlReflectionImporter(xao); 
     XmlSchemas schemas = new XmlSchemas(); 
     XmlSchemaExporter exporter = new XmlSchemaExporter(schemas); 
     XmlTypeMapping map = importer.ImportTypeMapping(typeof(T)); 
     exporter.ExportTypeMapping(map); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      schemas[0].Write(ms); 
      ms.Position = 0; 
      return new StreamReader(ms).ReadToEnd(); 
     } 
    } 
+1

Código completo en: http://stackoverflow.com/questions/336988/xml-serialization-and-schema-without-xsd-exe –

1

hacer esto:

public string GetFullSchema() { 

     string @namespace = "yourNamespace"; 

     var q = from t in Assembly.GetExecutingAssembly().GetTypes() 
     where t.IsClass && t.Namespace == @namespace 
     select t; 

     XmlReflectionImporter importer = new XmlReflectionImporter(@namespace); 

     XmlSchemas schemas = new XmlSchemas(); 
     XmlSchemaExporter exporter = new XmlSchemaExporter(schemas); 


     foreach (var x in q) 
     { 
       var map = importer.ImportTypeMapping(x); 
       exporter.ExportTypeMapping(map); 
     } 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      schemas[0].Write(ms); 
      ms.Position = 0; 
      return new StreamReader(ms).ReadToEnd(); 
     } 

} 
Cuestiones relacionadas