Нет причин, по которым вы не могли бы использовать тот же подход, который использует 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
для созданного вами преобразователя, который найдет импортированные схемы и предоставит их XmlSchemaSet
, когда вы позвоните Compile()
на него.
Импортированные схемы могут объявлять вещи в другом пространстве имен, и если вы хотите, чтобы XmlSerializer
генерировал XML с импортированными элементами в другом пространстве имен, вам, возможно, придется взломать сгенерированный CodeDOM.
Но это возможно.
Удачи!