2008-11-23 6 views
3

J'ai des XSD qui définissent la hiérarchie de mes objets. par exemple math.xsd, base.xsd tandis que math.xsd dépend de base.xsd. J'ai besoin de générer des classes à partir de ces xsd-s. J'ai déjà lu à propos de ces deux outils: CodeXS et XSD.exe. le problème avec le xsd.exe est que je n'ai pas réussi à générer des classes à partir de deux xsd-s qui dépendent les uns des autres. Y at-il quelqu'un qui connaît les bons paramètres pour l'utilisation du xsd.exe pour un tel cas?Générer des objets .Net à partir de XSD connus

De plus, je suis à la recherche pour: - Autres outils - comparaison entre ces outils - XSD à l'objet en utilisant .net 3.5 Merci.

+0

Comment la dépendance entre math.xsd et base.xsd est-elle implémentée? Est-ce valide XML? – PVitt

Répondre

0

Avez-vous essayé le LINQ to XSD? Le nom du projet ne décrit pas vraiment son objectif, donc je devrais dire qu'il est utile de remplacer xsd.exe.

0

J'ai eu un projet il y a un certain temps, qui consistait à transformer des documents DTD en documents XSD, puis en classes .Net. XSD.exe s'est avéré le code d'uselness puisqu'il y avait un certain nombre de documents XSD qui se sont référés à une base commune XSD. J'ai fini par écrire mon propre générateur XSD vers .Net en utilisant une combinaison de réflexion pour manipuler les internes de system.xml et en reverse engineering xsd.exe. Il m'a fallu environ 2 semaines pour pirater un générateur viable.

3

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!

1

est un produit commercial [cher], et je ne peux pas le garantir dans un sens ou dans l'autre, mais une autre possibilité est http://www.liquid-technologies.com/. Leur outil 'xsd-gen' supporte de nombreux langages tels que Java/C#/Silverlight et même C++! Cela vaut le coup d'oeil si vous avez besoin de supporter deux langues de manière cohérente.

Note: ils ont une édition communautaire mais n'ont pas de capacités code-gen.