2010-11-10 6 views
7

Ich möchte ein XML-Schema basierend auf einer Klasse generieren, so wie Sie mit der Xsd.exe tool tun können.Programmgesteuertes Verwenden der XSD.exe-Toolfunktion (Schema aus der Klasse generieren) über .NET Framework-Klassen?

z. xsd.exe /type: typename /outputdir:c:\ assmeblyname.

Gibt es eine Möglichkeit, dies zu tun mit Klassen in .NET Framework statt das eigenständige Tool zu verwenden?

Ich bin sicher, ich habe Informationen über Aufgabenverweise oder ähnliches - dh etwas Programmgesteuertes - gesehen, das anstelle von einigen dieser Standalone-Dienstprogramme verwendet werden kann oder dass einige eigenständige Dienstprogramme ihre Funktionen über die FCL oder ein Microsoft erhalten API.

+0

Nicht, dass ich mir bewusst bin (als One-Shot-Klasse mit einem ' GenerateXsd() 'Methode). Aber Sie können es mit einer anständigen Menge an Ellbogen Fett mit einer Reihe von Klassen aus System.Reflection und System.Xml neu erstellen. –

+0

Hmmmmm ... danke JesseC. Kennt jemand etwas von diesem vorverpackten Ellenbogenfett im Internet? –

+0

Nicht das, was Sie suchen, aber Sie könnten das Werkzeug einpacken. Wenn es ein .NET-Tool ist, können Sie auch auf die EXE-Datei verweisen und den Code kooptieren. –

Antwort

1

diese gefunden, die aussehen wie es den Trick tun soll ...

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

Vollständiger Code unter: http://stackoverflow.com/questions/336988/xml-serialization-and-schema-without-xsd-exe –

1

dies tun:

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

} 
Verwandte Themen