您可以采用与 xsd.exe
相同的方法,但然后运行您自己的代码来修改生成的 CodeDOM 模型,以便在将 .cs 文件写入磁盘之前进行所需的修改。
一般的想法是将 XSD 文件加载到 XmlSchema
对象中,然后使用内部的 XmlCodeExporter
和 XmlSchemaImporter
类来填充 CodeDOM 命名空间。
完成后,您可以自由地对 CodeDOM AST 进行任何必要的调整,然后将其写出到磁盘。
例如:
XmlSchema schema = null; // Load XSD file here
var schemas = new XmlSchemas();
schemas.Add(schema);
var ns = new CodeNamespace { Name = "MyNamespace" };
ns.Imports.Add(new CodeNamespaceImport("System"));
ns.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
var exporter = new XmlCodeExporter(ns);
var importer = new XmlSchemaImporter(schemas);
foreach (XmlSchemaElement element in schema.Elements.Values)
{
var mapping = importer.ImportTypeMapping(element.QualifiedName);
exporter.ExportTypeMapping(mapping);
}
// Transform CodeDOM as required, adding new attributes, methods, modifying
// inheritance hierarchy, whatever.
var provider = new CSharpCodeProvider();
using (var writer = new StreamWriter(outputFile, false))
provider.GenerateCodeFromNamespace(ns, writer, new CodeGeneratorOptions())
XmlSchemaSet
,并设置 XmlResolver
属性为一个由你编写的解析器,该解析器将找到导入的架构并在调用 Compile()
时提供给 XmlSchemaSet
。XmlSerializer
生成带有不同命名空间中导入项的 XML,则可能需要对生成的 CodeDOM 进行一些修改。这是一个[昂贵的]商业产品,我无法保证它的好坏,但另一种可能性是http://www.liquid-technologies.com/。他们的'xsd-gen'工具支持许多语言,如Java/C#/Silverlight甚至C++!如果您需要始终支持两种语言,那么值得一看。
注意:他们有一个社区版,但没有代码生成功能。