void GetChildElementCompletionData(XmlCompletionDataList data, XmlSchemaObjectCollection items, string prefix)
 {
     foreach (XmlSchemaObject schemaObject in items)
     {
         var childElement = schemaObject as XmlSchemaElement;
         if (childElement != null)
         {
             string name = childElement.Name;
             if (name == null)
             {
                 name = childElement.RefName.Name;
                 var element = FindElement(childElement.RefName);
                 if (element != null)
                 {
                     if (element.IsAbstract)
                     {
                         AddSubstitionGroupElements(data, element.QualifiedName, prefix);
                     }
                     else
                     {
                         data.AddElement(name, prefix, element.Annotation);
                     }
                 }
                 else
                 {
                     data.AddElement(name, prefix, childElement.Annotation);
                 }
             }
             else
             {
                 data.AddElement(name, prefix, childElement.Annotation);
             }
             continue;
         }
         var childSequence = schemaObject as XmlSchemaSequence;
         if (childSequence != null)
         {
             GetChildElementCompletionData(data, childSequence.Items, prefix);
             continue;
         }
         var childChoice = schemaObject as XmlSchemaChoice;
         if (childChoice != null)
         {
             GetChildElementCompletionData(data, childChoice.Items, prefix);
             continue;
         }
         var groupRef = schemaObject as XmlSchemaGroupRef;
         if (groupRef != null)
         {
             GetChildElementCompletionData(data, groupRef, prefix);
             continue;
         }
     }
 }
 /// <summary>
 /// Adds any elements that have the specified substitution group.
 /// </summary>
 void AddSubstitionGroupElements(XmlCompletionDataList data, XmlQualifiedName group, string prefix)
 {
     foreach (XmlSchemaElement element in schema.Elements.Values)
     {
         if (element.SubstitutionGroup == group)
         {
             data.AddElement(element.Name, prefix, element.Annotation);
         }
     }
 }
        /// <summary>
        /// Gets the possible root elements for an xml document using this schema.
        /// </summary>
        public CompletionDataList GetElementCompletionData(string namespacePrefix)
        {
            EnsureLoaded();

            var data = new XmlCompletionDataList();

            foreach (XmlSchemaElement element in schema.Elements.Values)
            {
                if (element.Name != null)
                {
                    data.AddElement(element.Name, namespacePrefix, element.Annotation);
                }
                else
                {
                    // Do not add reference element.
                }
            }
            return(data);
        }
		void GetChildElementCompletionData (XmlCompletionDataList data, XmlSchemaObjectCollection items, string prefix)
		{
			foreach (XmlSchemaObject schemaObject in items) {
				var childElement = schemaObject as XmlSchemaElement;
				if (childElement != null) {
					string name = childElement.Name;
					if (name == null) {
						name = childElement.RefName.Name;
						var element = FindElement (childElement.RefName);
						if (element != null) {
							if (element.IsAbstract) {
								AddSubstitionGroupElements (data, element.QualifiedName, prefix);
							} else {
								data.AddElement (name, prefix, element.Annotation);
							}
						} else {
							data.AddElement (name, prefix, childElement.Annotation);						
						}
					} else {
						data.AddElement (name, prefix, childElement.Annotation);
					}
					continue;
				}
				var childSequence = schemaObject as XmlSchemaSequence;
				if (childSequence != null) {
					GetChildElementCompletionData (data, childSequence.Items, prefix);
					continue;
				}
				var childChoice = schemaObject as XmlSchemaChoice;
				if (childChoice != null) {
					GetChildElementCompletionData (data, childChoice.Items, prefix);
					continue;
				}
				var groupRef = schemaObject as XmlSchemaGroupRef;
				if (groupRef != null) {
					GetChildElementCompletionData (data, groupRef, prefix);
					continue;
				}
			}
		}
		/// <summary>
		/// Gets the possible root elements for an xml document using this schema.
		/// </summary>
		public CompletionDataList GetElementCompletionData (string namespacePrefix)
		{
			EnsureLoaded ();
			
			var data = new XmlCompletionDataList ();
			foreach (XmlSchemaElement element in schema.Elements.Values) {
				if (element.Name != null) {
					data.AddElement (element.Name, namespacePrefix, element.Annotation);
				} else {
					// Do not add reference element.
				}
			}
			return data;
		}
		/// <summary>
		/// Adds any elements that have the specified substitution group.
		/// </summary>
		void AddSubstitionGroupElements (XmlCompletionDataList data, XmlQualifiedName group, string prefix)
		{
			foreach (XmlSchemaElement element in schema.Elements.Values)
				if (element.SubstitutionGroup == group)
					data.AddElement (element.Name, prefix, element.Annotation);
		}