Skip to content

Commit

Permalink
Add support for nested non-nullable choice members
Browse files Browse the repository at this point in the history
  • Loading branch information
jmatss committed Jun 15, 2022
1 parent 8204bee commit c72e203
Showing 1 changed file with 25 additions and 3 deletions.
28 changes: 25 additions & 3 deletions XmlSchemaClassGenerator/ModelBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
}

var effectiveElement = substitute?.Element ?? element;
var isNullableByChoice = IsNullableByChoice(item.XmlParent);
var propertyName = _configuration.NamingProvider.ElementNameFromQualifiedName(effectiveElement.QualifiedName, effectiveElement);
var originalPropertyName = propertyName;
if (propertyName == typeModel.Name)
Expand All @@ -934,9 +935,9 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
OriginalPropertyName = originalPropertyName,
Type = substitute?.Type ?? CreateTypeModel(element.ElementSchemaType, elementQualifiedName),
IsNillable = element.IsNillable,
IsNullable = item.MinOccurs < 1.0m || (item.XmlParent is XmlSchemaChoice),
IsNullable = item.MinOccurs < 1.0m || isNullableByChoice,
IsCollection = item.MaxOccurs > 1.0m || particle.MaxOccurs > 1.0m, // http://msdn.microsoft.com/en-us/library/vstudio/d3hx2s7e(v=vs.100).aspx
DefaultValue = element.DefaultValue ?? ((item.MinOccurs >= 1.0m && item.XmlParent is not XmlSchemaChoice) ? element.FixedValue : null),
DefaultValue = element.DefaultValue ?? ((item.MinOccurs >= 1.0m && !isNullableByChoice) ? element.FixedValue : null),
FixedValue = element.FixedValue,
XmlNamespace = !string.IsNullOrEmpty(effectiveElement.QualifiedName.Namespace) && effectiveElement.QualifiedName.Namespace != typeModel.XmlSchemaName.Namespace
? effectiveElement.QualifiedName.Namespace : null,
Expand Down Expand Up @@ -969,7 +970,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
OwningType = typeModel,
Name = "Any",
Type = new SimpleModel(_configuration) { ValueType = (_configuration.UseXElementForAny ? typeof(XElement) : typeof(XmlElement)), UseDataTypeAttribute = false },
IsNullable = item.MinOccurs < 1.0m || (item.XmlParent is XmlSchemaChoice),
IsNullable = item.MinOccurs < 1.0m || IsNullableByChoice(item.XmlParent),
IsCollection = item.MaxOccurs > 1.0m || particle.MaxOccurs > 1.0m, // http://msdn.microsoft.com/en-us/library/vstudio/d3hx2s7e(v=vs.100).aspx
IsAny = true,
XmlParticle = item.XmlParticle,
Expand Down Expand Up @@ -1020,6 +1021,27 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
return properties;
}

private static bool IsNullableByChoice(XmlSchemaObject parent)
{
while (parent != null)
{
switch (parent)
{
case XmlSchemaChoice:
return true;
// Any ancestor element between the current item and the
// choice would already have been forced to nullable.
case XmlSchemaElement:
case XmlSchemaParticle p when p.MinOccurs < 1.0m:
return false;
default:
break;
}
parent = parent.Parent;
}
return false;
}

private NamespaceModel CreateNamespaceModel(Uri source, XmlQualifiedName qualifiedName)
{
NamespaceModel namespaceModel = null;
Expand Down

0 comments on commit c72e203

Please sign in to comment.