private XmlSchemaChoice GetSubstitutionChoice(XmlSchemaElement element) { if (_substitutionGroupsTable == null) { BuildSubstitutionGroups(); } if (_substitutionGroupsTable != null) { SubstitutionGroupWrapper substitutionGroup = (SubstitutionGroupWrapper)_substitutionGroupsTable[element.QualifiedName]; if (substitutionGroup != null) { //Element is head of a substitutionGroup XmlSchemaChoice choice = new XmlSchemaChoice(); foreach (XmlSchemaElement elem in substitutionGroup.Members) { choice.Items.Add(elem); } XmlSchemaElement headElement = (XmlSchemaElement)_schemaSet.GlobalElements[element.QualifiedName]; if (headElement.IsAbstract) { //Should not generate the abstract element choice.Items.Remove(headElement); } choice.MinOccurs = element.MinOccurs; choice.MaxOccurs = element.MaxOccurs; return(choice); } } return(null); }
private void BuildSubstitutionGroups() { foreach (XmlSchemaElement element in _schemaSet.GlobalElements.Values) { XmlQualifiedName head = element.SubstitutionGroup; if (!head.IsEmpty) { if (_substitutionGroupsTable == null) { _substitutionGroupsTable = new Hashtable(); } SubstitutionGroupWrapper substitutionGroup = (SubstitutionGroupWrapper)_substitutionGroupsTable[head]; if (substitutionGroup == null) { substitutionGroup = new SubstitutionGroupWrapper(); substitutionGroup.Head = head; _substitutionGroupsTable.Add(head, substitutionGroup); } ArrayList members = substitutionGroup.Members; if (!members.Contains(element)) { //Members might contain element if the same schema is included and imported through different paths. Imp, hence will be added to set directly members.Add(element); } } } if (_substitutionGroupsTable != null) { //There were subst grps in the schema foreach (SubstitutionGroupWrapper substGroup in _substitutionGroupsTable.Values) { ResolveSubstitutionGroup(substGroup); } } }
private void ResolveSubstitutionGroup(SubstitutionGroupWrapper substitutionGroup) { ArrayList newMembers = null; XmlSchemaElement headElement = (XmlSchemaElement)_schemaSet.GlobalElements[substitutionGroup.Head]; if (substitutionGroup.Members.Contains(headElement)) { // already checked return; } foreach (XmlSchemaElement element in substitutionGroup.Members) { //Chain to other head's that are members of this head's substGroup SubstitutionGroupWrapper g = (SubstitutionGroupWrapper)_substitutionGroupsTable[element.QualifiedName]; if (g != null) { ResolveSubstitutionGroup(g); foreach (XmlSchemaElement element1 in g.Members) { if (element1 != element) { //Exclude the head if (newMembers == null) { newMembers = new ArrayList(); } newMembers.Add(element1); } } } } if (newMembers != null) { foreach (XmlSchemaElement newMember in newMembers) { substitutionGroup.Members.Add(newMember); } } substitutionGroup.Members.Add(headElement); }