From c88b0d9bd0a907378372fd9d2a39477754d1ce8b Mon Sep 17 00:00:00 2001 From: Michael Ganss Date: Mon, 26 Jul 2021 16:51:07 +0200 Subject: [PATCH] Pass parent MinOccurs and MaxOccurs when creating properties (see #273) --- XmlSchemaClassGenerator/ModelBuilder.cs | 23 +++++++++++++---------- XmlSchemaClassGenerator/Particle.cs | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/XmlSchemaClassGenerator/ModelBuilder.cs b/XmlSchemaClassGenerator/ModelBuilder.cs index 84eea232..41d73525 100644 --- a/XmlSchemaClassGenerator/ModelBuilder.cs +++ b/XmlSchemaClassGenerator/ModelBuilder.cs @@ -119,7 +119,7 @@ private void CreateSubstitutes() var cls = (ClassModel)prop.OwningType; var schema = substitute.Element.GetSchema(); var source = CodeUtilities.CreateUri(schema.SourceUri); - var props = CreatePropertiesForElements(source, cls, prop.XmlParticle, new[] { prop.Particle }, substitute, order); + var props = CreatePropertiesForElements(source, cls, prop.Particle, new[] { prop.Particle }, substitute, order); cls.Properties.AddRange(props); @@ -379,8 +379,9 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaGroup group, NamespaceMod Types[key] = interfaceModel; } - var particle = group.Particle; - var items = GetElements(particle); + var xmlParticle = group.Particle; + var particle = new Particle(xmlParticle, group.Parent); + var items = GetElements(xmlParticle); var properties = CreatePropertiesForElements(source, interfaceModel, particle, items.Where(i => !(i.XmlParticle is XmlSchemaGroupRef))); interfaceModel.Properties.AddRange(properties); var interfaces = items.Select(i => i.XmlParticle).OfType() @@ -462,20 +463,20 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType, if (baseModel is ClassModel baseClassModel) { baseClassModel.DerivedTypes.Add(classModel); } } - XmlSchemaParticle particle = null; + XmlSchemaParticle xmlParticle = null; if (classModel.BaseClass != null) { if (complexType.ContentModel.Content is XmlSchemaComplexContentExtension complexContent) { - particle = complexContent.Particle; + xmlParticle = complexContent.Particle; } // If it's a restriction, do not duplicate elements on the derived class, they're already in the base class. // See https://msdn.microsoft.com/en-us/library/f3z3wh0y.aspx } - else particle = complexType.Particle ?? complexType.ContentTypeParticle; + else xmlParticle = complexType.Particle ?? complexType.ContentTypeParticle; - var items = GetElements(particle, complexType).ToList(); + var items = GetElements(xmlParticle, complexType).ToList(); if (_configuration.GenerateInterfaces) { @@ -485,6 +486,7 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType, classModel.AddInterfaces(interfaces); } + var particle = new Particle(xmlParticle, xmlParticle?.Parent); var properties = CreatePropertiesForElements(source, classModel, particle, items); classModel.Properties.AddRange(properties); @@ -763,10 +765,11 @@ private IEnumerable CreatePropertiesForAttributes(Uri source, Typ return properties; } - private IEnumerable CreatePropertiesForElements(Uri source, TypeModel typeModel, XmlSchemaParticle particle, IEnumerable items, + private IEnumerable CreatePropertiesForElements(Uri source, TypeModel typeModel, Particle particle, IEnumerable items, Substitute substitute = null, int order = 0) { var properties = new List(); + var xmlParticle = particle.XmlParticle; foreach (var item in items) { @@ -784,7 +787,7 @@ private IEnumerable CreatePropertiesForElements(Uri source, TypeM if (elementQualifiedName.IsEmpty) { // inner type, have to generate a type name - var typeModelName = particle is XmlSchemaGroupRef groupRef ? groupRef.RefName : typeModel.XmlSchemaName; + var typeModelName = xmlParticle is XmlSchemaGroupRef groupRef ? groupRef.RefName : typeModel.XmlSchemaName; var typeName = _configuration.NamingProvider.PropertyNameFromElement(typeModelName.Name, element.QualifiedName.Name); elementQualifiedName = new XmlQualifiedName(typeName, typeModel.XmlSchemaName.Namespace); // try to avoid name clashes @@ -861,7 +864,7 @@ private IEnumerable CreatePropertiesForElements(Uri source, TypeM } var groupItems = GetElements(group.Particle); - var groupProperties = CreatePropertiesForElements(source, typeModel, item.XmlParticle, groupItems, order: order).ToList(); + var groupProperties = CreatePropertiesForElements(source, typeModel, item, groupItems, order: order).ToList(); if (_configuration.EmitOrder) { order += groupProperties.Count; diff --git a/XmlSchemaClassGenerator/Particle.cs b/XmlSchemaClassGenerator/Particle.cs index ef20f019..2044fde4 100644 --- a/XmlSchemaClassGenerator/Particle.cs +++ b/XmlSchemaClassGenerator/Particle.cs @@ -13,8 +13,8 @@ public Particle(XmlSchemaParticle particle, XmlSchemaObject parent) { XmlParticle = particle; XmlParent = parent; - MinOccurs = particle.MinOccurs; - MaxOccurs = particle.MaxOccurs; + MinOccurs = particle?.MinOccurs ?? 1; + MaxOccurs = particle?.MaxOccurs ?? 1; } public XmlSchemaParticle XmlParticle { get; set; }