2010-11-10 13 views
7

voglio generare uno schema XML basata su una classe, proprio come si può fare con il Xsd.exe tool.Utilizzare in modo programmatico la funzionalità di XSD.exe (generare schemi dalla classe) tramite classi .NET Framework?

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

C'è un modo per farlo utilizzando le classi in .NET Framework invece di utilizzare lo strumento standalone?

Sono sicuro di aver visto informazioni sui riferimenti alle attività o simili - cioè qualcosa di programmatico - che può essere utilizzato al posto di alcune di queste utility autonome o che alcune utilità indipendenti ottengono le loro funzionalità tramite FCL o Microsoft API.

+0

Non che io sappia (come una classe one-shot con un ' Metodo GenerateXsd() '). Ma è possibile con una buona quantità di grasso di gomito ricrearlo con un numero di classi da System.Reflection e System.Xml. –

+0

Hmmmmm ... grazie JesseC. Qualcuno sa di questo grasso gomito preconfezionato su Internet? –

+0

Non è quello che stai cercando, ma potresti avvolgere lo strumento. Se si tratta di uno strumento .NET, è anche possibile fare riferimento al file exe e cooptare il codice. –

risposta

1

Trovato questo che sembra che dovrebbe fare il trucco ...

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

codice completo a: http://stackoverflow.com/questions/336988/xml-serialization-and-schema-without-xsd-exe –

1

fare questo:

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

}