Il n'y a aucune raison que vous ne puissiez pas utiliser la même approche que xsd.exe
utilise, mais exécutez votre propre code sur le modèle CodeDOM généré pour apporter les modifications dont vous avez besoin avant d'écrire les fichiers .cs sur le disque.
L'idée générale est que vous chargez votre fichier XSD dans un objet XmlSchema
, puis utilisez les XmlCodeExporter
et XmlSchemaImporter
internes des classes pour remplir un espace de noms CodeDOM. Une fois que vous avez fait cela, vous êtes libre de faire des ajustements que vous devez faire contre l'AST CodeDOM, puis l'écrire sur le disque.
Par exemple.
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())
Si vos schémas de référence d'autres schémas, vous devez utiliser XmlSchemaSet
et définir la propriété XmlResolver
à un résolveur que vous écrivez, qui trouvera les schémas importés et les fournir au XmlSchemaSet
lorsque vous appelez Compile()
dessus.
Il est possible que les schémas importés déclarent des objets dans un espace de noms différent et si vous voulez que votre XmlSerializer
génère du XML avec les éléments importés dans un espace de noms différent, vous devrez peut-être pirater le CodeDOM généré.
Mais c'est possible.
Bonne chance!
Comment la dépendance entre math.xsd et base.xsd est-elle implémentée? Est-ce valide XML? – PVitt