private ArrayMapping ImportArrayMapping(XmlSchemaType type, string identifier, string ns, bool repeats)
{
if (!(type is XmlSchemaComplexType)) return null;
if (!type.DerivedFrom.IsEmpty) return null;
if (IsMixed(type)) return null;
Mapping previousMapping = (Mapping)ImportedMappings[type];
if (previousMapping != null)
{
if (previousMapping is ArrayMapping)
return (ArrayMapping)previousMapping;
else
return null;
}
TypeItems items = GetTypeItems(type);
if (items.Attributes != null && items.Attributes.Count > 0) return null;
if (items.AnyAttribute != null) return null;
if (items.Particle == null) return null;
XmlSchemaGroupBase item = items.Particle;
ArrayMapping arrayMapping = new ArrayMapping();
arrayMapping.TypeName = identifier;
arrayMapping.Namespace = ns;
if (item is XmlSchemaChoice)
{
XmlSchemaChoice choice = (XmlSchemaChoice)item;
if (!choice.IsMultipleOccurrence)
return null;
bool needExplicitOrder = false;
MemberMapping choiceMember = ImportChoiceGroup(choice, identifier, null, null, null, ns, true, ref needExplicitOrder, false);
if (choiceMember.ChoiceIdentifier != null) return null;
arrayMapping.TypeDesc = choiceMember.TypeDesc;
arrayMapping.Elements = choiceMember.Elements;
arrayMapping.TypeName = (type.Name == null || type.Name.Length == 0) ? "ArrayOf" + CodeIdentifier.MakePascal(arrayMapping.TypeDesc.Name) : type.Name;
}
else if (item is XmlSchemaAll || item is XmlSchemaSequence)
{
if (item.Items.Count != 1 || !(item.Items[0] is XmlSchemaElement)) return null;
XmlSchemaElement itemElement = (XmlSchemaElement)item.Items[0];
if (!itemElement.IsMultipleOccurrence) return null;
if (IsCyclicReferencedType(itemElement, new List<string>(1) { identifier }))
{
return null;
}
ElementAccessor itemAccessor = ImportElement(itemElement, identifier, typeof(TypeMapping), null, ns, false);
if (itemAccessor.Any)
return null;
arrayMapping.Elements = new ElementAccessor[] { itemAccessor };
arrayMapping.TypeDesc = ((TypeMapping)itemAccessor.Mapping).TypeDesc.CreateArrayTypeDesc();
arrayMapping.TypeName = (type.Name == null || type.Name.Length == 0) ? "ArrayOf" + CodeIdentifier.MakePascal(itemAccessor.Mapping.TypeDesc.Name) : type.Name;
}
else
{
return null;
}
ImportedMappings[type] = arrayMapping;
Scope.AddTypeMapping(arrayMapping);
// for the array-like mappings we need to create a struct mapping for the case when it referenced by the top-level element
arrayMapping.TopLevelMapping = ImportStructType(type, ns, identifier, null, true);
arrayMapping.TopLevelMapping.ReferencedByTopLevelElement = true;
if (type.Name != null && type.Name.Length != 0)
ImportDerivedTypes(new XmlQualifiedName(identifier, ns));
return arrayMapping;
}