I’ve been working on a project that required me to turn some CLR types into a set of XML Schema element definitions so that they can be included in another file. It stumped me for a while, and I envisioned having to reflect over all my types and build schema myself, which would be a total drag.

Then I remembered that this is exactly what xsd.exe does. Thank the heavens for Reflector! It turns out to be really simple, just undocumented…

XmlReflectionImporter importer1 = new XmlReflectionImporter();

XmlSchemas schemas = new XmlSchemas();

XmlSchemaExporter exporter1 = new XmlSchemaExporter(schemas);

Type type = typeof(MyTypeToConvert);

XmlTypeMapping map = importer1.ImportTypeMapping(type);

exporter1.ExportTypeMapping(map);

It’s that easy! The XmlSchemaExporter will do all the right things, and you can do this with a bunch of types in a loop, then check your XmlSchemas collection. It will contain one XmlSchema per namespace, with all the right types, just as if you’d run xsd.exe over your assembly.

Even better, if there’s stuff in your CLR types that isn’t quite right, you can use XmlAttributeOverrides just like you can with the XmlSerializer. So if you want to exclude a property called “IgnoreMe” from your MyTypeToConvert type…

// Create the XmlAttributeOverrides and XmlAttributes objects.

XmlAttributeOverrides xOver = new XmlAttributeOverrides();

XmlAttributes attrs = new XmlAttributes();

/* Use the XmlIgnore to instruct the XmlSerializer to ignore

the IgnoreMe prop */

attrs = new XmlAttributes();

attrs.XmlIgnore = true;

xOver.Add(typeof(MyTypeToConvert), "IgnoreMe", attrs);

XmlReflectionImporter importer1 = new XmlReflectionImporter(xOver);

XmlSchemas schemas = new XmlSchemas();

XmlSchemaExporter exporter1 = new XmlSchemaExporter(schemas);

Type type = typeof(MyTypeToConvert);

XmlTypeMapping map = importer1.ImportTypeMapping(type);

exporter1.ExportTypeMapping(map);

That’ll get rid of the IgnoreMe element in the final schema. It took a bit of Reflectoring, but this saves me a ton of time.