private void ExportElementAccessor(XmlSchemaGroupBase group, ElementAccessor accessor, bool repeats, bool valueTypeOptional, string ns)
{
if (accessor.Any && accessor.Name.Length == 0)
{
XmlSchemaAny any = new XmlSchemaAny();
any.MinOccurs = 0;
any.MaxOccurs = repeats ? decimal.MaxValue : 1;
if (accessor.Namespace != null && accessor.Namespace.Length > 0 && accessor.Namespace != ns)
any.Namespace = accessor.Namespace;
group.Items.Add(any);
}
else
{
XmlSchemaElement element = (XmlSchemaElement)_elements[accessor];
int minOccurs = repeats || accessor.HasDefault || (!accessor.IsNullable && !accessor.Mapping.TypeDesc.IsValueType) || valueTypeOptional ? 0 : 1;
decimal maxOccurs = repeats || accessor.IsUnbounded ? decimal.MaxValue : 1;
if (element == null)
{
element = new XmlSchemaElement();
element.IsNillable = accessor.IsNullable;
element.Name = accessor.Name;
if (accessor.HasDefault)
element.DefaultValue = ExportDefaultValue(accessor.Mapping, accessor.Default);
if (accessor.IsTopLevelInSchema)
{
_elements.Add(accessor, element);
element.Form = accessor.Form;
AddSchemaItem(element, accessor.Namespace, ns);
}
else
{
element.MinOccurs = minOccurs;
element.MaxOccurs = maxOccurs;
// determine the form attribute value
XmlSchema schema = _schemas[ns];
if (schema == null)
element.Form = accessor.Form == elementFormDefault ? XmlSchemaForm.None : accessor.Form;
else
{
element.Form = accessor.Form == schema.ElementFormDefault ? XmlSchemaForm.None : accessor.Form;
}
}
ExportElementMapping(element, (TypeMapping)accessor.Mapping, accessor.Namespace, accessor.Any);
}
if (accessor.IsTopLevelInSchema)
{
XmlSchemaElement refElement = new XmlSchemaElement();
refElement.RefName = new XmlQualifiedName(accessor.Name, accessor.Namespace);
refElement.MinOccurs = minOccurs;
refElement.MaxOccurs = maxOccurs;
group.Items.Add(refElement);
AddSchemaImport(accessor.Namespace, ns);
}
else
{
group.Items.Add(element);
}
}
}