mganss / XmlSchemaClassGenerator

Generate C# classes from XML Schema files
Apache License 2.0
603 stars 180 forks source link

Avoid regenerating the same types over and over #497

Open digitaldias opened 7 months ago

digitaldias commented 7 months ago

I have a full set of XSD's, some which declare common types that are used in others. I don't know how I can run this tool (CLI or Nuget) to only generate the common types once. Our xsd's include:

Etc. it's a whole tree of different standards for these doc types.

An option to "do not include external xsd's" would help me, as I can then just add the correct "using" statements post creation. Is this possible to achieve? Concrete example:

Today, it reads and includes referenced xsd files and generates all the common types for every type that I have. A command line example could be:

> xsd2cs -n "Orders" --add-using "Common" --do-not-include -o Test .\Orders.xsd

Doable?

mganss commented 7 months ago

I'm not sure I understand the issue. For each distinct XML Schema type there should be only one corresponding C# class that is being generated. Where does the duplication occur in your use case?

digitaldias commented 7 months ago

I may be attempting to convert too much at once:

var xsdFiles = XsdFileFinder.FindXsdFilesWithNamespaces(rootFolder);

Console.WriteLine(new string('-', 120));

var namespaceMappings = new Dictionary<NamespaceKey, string>();

foreach (var xsdFile in xsdFiles)
{
    var key = new NamespaceKey(xsdFile.XsdNamespace);
    if (!namespaceMappings.ContainsKey(key))
    {
        namespaceMappings.Add(key, xsdFile.CSharpNamespace);
    }
}

var NsProvider = namespaceMappings
    .ToNamespaceProvider(new GeneratorConfiguration { NamespacePrefix = string.Empty }
    .NamespaceProvider.GenerateNamespace);

When I attempt to give the entire list to the generator, it fails profusely. with variants of The element has already been declarederrors.

If I run it in a foreach loop, all is good, but common types are repeated across the board.

mganss commented 7 months ago

Try passing only the XSD file to the generator that contains the root element resp. the elements that you are interested in de/serializing.