同じアプローチを使用できない理由はありませんがxsd.exe
、.cs ファイルをディスクに書き出す前に、生成された CodeDOM モデルに対して独自のコードを実行して、必要な変更を行います。
一般的な考え方は、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 をかなりハックする必要がある場合があります。
しかし、それは可能です。
幸運を!