From 5f0ae26ecb026a5db55d89c6b544ebffcf9a4194 Mon Sep 17 00:00:00 2001 From: Michael Ganss Date: Mon, 18 May 2020 13:56:06 +0200 Subject: [PATCH] Add (limited) support for unions (fixes #205) Generate enums only if no non-enum restrictions present --- XmlSchemaClassGenerator/Generator.cs | 24 ++++++++++++------------ XmlSchemaClassGenerator/ModelBuilder.cs | 15 +++++++++++---- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/XmlSchemaClassGenerator/Generator.cs b/XmlSchemaClassGenerator/Generator.cs index 7a4978bb..c859e1c3 100644 --- a/XmlSchemaClassGenerator/Generator.cs +++ b/XmlSchemaClassGenerator/Generator.cs @@ -243,18 +243,18 @@ public string PrivateMemberPrefix public bool EnableUpaCheck { get { return _configuration.EnableUpaCheck; } - set { _configuration.EnableUpaCheck = value; } - } - - public bool SeparateClasses - { - get { return _configuration.SeparateClasses; } - set { _configuration.SeparateClasses = value; } - } - - public void Generate(IEnumerable files) - { - var set = new XmlSchemaSet(); + set { _configuration.EnableUpaCheck = value; } + } + + public bool SeparateClasses + { + get { return _configuration.SeparateClasses; } + set { _configuration.SeparateClasses = value; } + } + + public void Generate(IEnumerable files) + { + var set = new XmlSchemaSet(); var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore }; var readers = files.Select(f => XmlReader.Create(f, settings)); diff --git a/XmlSchemaClassGenerator/ModelBuilder.cs b/XmlSchemaClassGenerator/ModelBuilder.cs index e1ba84b8..ae16ef31 100644 --- a/XmlSchemaClassGenerator/ModelBuilder.cs +++ b/XmlSchemaClassGenerator/ModelBuilder.cs @@ -455,12 +455,19 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType, private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel namespaceModel, XmlQualifiedName qualifiedName, List docs) { var restrictions = new List(); + List facets = new List(); if (simpleType.Content is XmlSchemaSimpleTypeRestriction typeRestriction) + facets = typeRestriction.Facets.Cast().ToList(); + else if (simpleType.Content is XmlSchemaSimpleTypeUnion typeUnion + && typeUnion.BaseMemberTypes.All(b => b.Content is XmlSchemaSimpleTypeRestriction r && r.Facets.Count > 0)) + facets = typeUnion.BaseMemberTypes.SelectMany(b => ((XmlSchemaSimpleTypeRestriction)b.Content).Facets.Cast()).ToList(); + + if (facets.Any()) { - var enumFacets = typeRestriction.Facets.OfType().ToList(); - // If there's a pattern restriction mixed into the enumeration values, we'll generate a string to play it safe. - var isEnum = enumFacets.Count > 0 && !typeRestriction.Facets.OfType().Any(); + var enumFacets = facets.OfType().ToList(); + // If there are other restrictions mixed into the enumeration values, we'll generate a string to play it safe. + var isEnum = enumFacets.Count > 0 && enumFacets.Count == facets.Count; if (isEnum) { // we got an enum @@ -511,7 +518,7 @@ private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel return enumModel; } - restrictions = GetRestrictions(typeRestriction.Facets.Cast(), simpleType).Where(r => r != null).Sanitize().ToList(); + restrictions = GetRestrictions(facets, simpleType).Where(r => r != null).Sanitize().ToList(); } var simpleModelName = _configuration.NamingProvider.SimpleTypeNameFromQualifiedName(qualifiedName);