XmlSchemaClassGenerator icon indicating copy to clipboard operation
XmlSchemaClassGenerator copied to clipboard

Avoid regenerating the same types over and over

Open digitaldias opened this issue 1 year ago • 3 comments

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:

  • Common types
  • Orders
  • Invoices
  • OrderConfirmations

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:

  • I extract the common types xsd into namespace MyBusiness.Standards.Standard1.v1_1.Common
  • When I extract "Orders" xsd, it goes into namespace MyBusiness.Standards.Standard1.v1_1.Orders but with an instruction to include a using statement for the first namespace.

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?

digitaldias avatar Mar 13 '24 10:03 digitaldias

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?

mganss avatar Mar 13 '24 17:03 mganss

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.

digitaldias avatar Mar 19 '24 06:03 digitaldias

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

mganss avatar Mar 19 '24 14:03 mganss