XmlCompletionDataCollection GetAttributeCompletionData(XmlSchemaSimpleContentExtension extension)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      data.AddRange(GetAttributeCompletionData(extension.Attributes));

      return data;
    }
    XmlCompletionDataCollection GetAttributeCompletionData(XmlSchemaObjectCollection attributes)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      foreach (XmlSchemaObject schemaObject in attributes)
      {
        XmlSchemaAttribute attribute = schemaObject as XmlSchemaAttribute;
        XmlSchemaAttributeGroupRef attributeGroupRef = schemaObject as XmlSchemaAttributeGroupRef;
        if (attribute != null)
        {
          if (!IsProhibitedAttribute(attribute))
          {
            AddAttribute(data, attribute);
          }
          else
          {
            prohibitedAttributes.Add(attribute);
          }
        }
        else if (attributeGroupRef != null)
        {
          data.AddRange(GetAttributeCompletionData(attributeGroupRef));
        }
      }
      return data;
    }
    XmlCompletionDataCollection GetAttributeCompletionData(XmlSchemaComplexContentExtension extension)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      data.AddRange(GetAttributeCompletionData(extension.Attributes));
      XmlSchemaComplexType baseComplexType = FindNamedType(schema, extension.BaseTypeName);
      if (baseComplexType != null)
      {
        data.AddRange(GetAttributeCompletionData(baseComplexType));
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeCompletionData(XmlSchemaSimpleContent simpleContent)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      XmlSchemaSimpleContentExtension extension = simpleContent.Content as XmlSchemaSimpleContentExtension;
      if (extension != null)
      {
        data.AddRange(GetAttributeCompletionData(extension));
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeCompletionData(XmlSchemaElement element)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      XmlSchemaComplexType complexType = GetElementAsComplexType(element);

      if (complexType != null)
      {
        data.AddRange(GetAttributeCompletionData(complexType));
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeCompletionData(XmlSchemaComplexType complexType)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      data = GetAttributeCompletionData(complexType.Attributes);

      // Add any complex content attributes.
      XmlSchemaComplexContent complexContent = complexType.ContentModel as XmlSchemaComplexContent;
      if (complexContent != null)
      {
        XmlSchemaComplexContentExtension extension = complexContent.Content as XmlSchemaComplexContentExtension;
        XmlSchemaComplexContentRestriction restriction = complexContent.Content as XmlSchemaComplexContentRestriction;
        if (extension != null)
        {
          data.AddRange(GetAttributeCompletionData(extension));
        }
        else if (restriction != null)
        {
          data.AddRange(GetAttributeCompletionData(restriction));
        }
      }
      else
      {
        XmlSchemaSimpleContent simpleContent = complexType.ContentModel as XmlSchemaSimpleContent;
        if (simpleContent != null)
        {
          data.AddRange(GetAttributeCompletionData(simpleContent));
        }
      }

      return data;
    }
    XmlCompletionDataCollection GetChildElementCompletionData(XmlSchemaObjectCollection items, string prefix)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      foreach (XmlSchemaObject schemaObject in items)
      {

        XmlSchemaElement childElement = schemaObject as XmlSchemaElement;
        XmlSchemaSequence childSequence = schemaObject as XmlSchemaSequence;
        XmlSchemaChoice childChoice = schemaObject as XmlSchemaChoice;
        XmlSchemaGroupRef groupRef = schemaObject as XmlSchemaGroupRef;
        XmlSchemaAny anyRef = schemaObject as XmlSchemaAny;

        if (childElement != null)
        {
          string name = childElement.Name;
          if (name == null)
          {
            name = childElement.RefName.Name;
            XmlSchemaElement element = FindElement(childElement.RefName);
            if (element != null)
            {
              if (element.IsAbstract)
              {
                AddSubstitionGroupElements(data, element.QualifiedName, prefix);
              }
              else
              {
                AddElement(data, name, prefix, element.Annotation ?? element.ElementSchemaType.Annotation);
              }
            }
            else
            {
              AddElement(data, name, prefix, childElement.Annotation ?? childElement.ElementSchemaType.Annotation);
            }
          }
          else
          {
            AddElement(data, name, prefix, childElement.Annotation ?? childElement.ElementSchemaType.Annotation);
          }
        }
        else if (childSequence != null)
        {
          AddElements(data, GetChildElementCompletionData(childSequence.Items, prefix));
        }
        else if (childChoice != null)
        {
          AddElements(data, GetChildElementCompletionData(childChoice.Items, prefix));
        }
        else if (groupRef != null)
        {
          AddElements(data, GetChildElementCompletionData(groupRef, prefix));
        }
        else if (anyRef != null)
        {
          if (string.IsNullOrEmpty(anyRef.Namespace) || anyRef.Namespace == schema.TargetNamespace)
          {
            data.AddRange(GetElementCompletionData(prefix).OfType<XmlCompletionData>().ToArray());
          }
          else if (RelatedSchemas != null)
          {
            var completion = RelatedSchemas[anyRef.Namespace];
            if (completion != null)
            {
              completion._namespaces = _namespaces;
              data.AddRange(completion.GetElementCompletionData(null).OfType<XmlCompletionData>().ToArray());
            }
          }
        }
      }

      return data;
    }
    XmlCompletionDataCollection GetChildElementCompletionData(XmlSchemaComplexContentExtension extension, string prefix)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      XmlSchemaComplexType complexType = FindNamedType(schema, extension.BaseTypeName);
      if (complexType != null)
      {
        data = GetChildElementCompletionData(complexType, prefix);
      }

      // Add any elements.
      if (extension.Particle != null)
      {
        XmlSchemaSequence sequence = extension.Particle as XmlSchemaSequence;
        XmlSchemaChoice choice = extension.Particle as XmlSchemaChoice;
        XmlSchemaGroupRef groupRef = extension.Particle as XmlSchemaGroupRef;

        if (sequence != null)
        {
          data.AddRange(GetChildElementCompletionData(sequence.Items, prefix));
        }
        else if (choice != null)
        {
          data.AddRange(GetChildElementCompletionData(choice.Items, prefix));
        }
        else if (groupRef != null)
        {
          data.AddRange(GetChildElementCompletionData(groupRef, prefix));
        }
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeValueCompletionData(XmlSchemaSimpleTypeList list)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      if (list.ItemType != null)
      {
        data.AddRange(GetAttributeValueCompletionData(list.ItemType));
      }
      else if (list.ItemTypeName != null)
      {
        XmlSchemaSimpleType simpleType = FindSimpleType(list.ItemTypeName);
        if (simpleType != null)
        {
          data.AddRange(GetAttributeValueCompletionData(simpleType));
        }
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeValueCompletionData(XmlSchemaSimpleType simpleType)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      XmlSchemaSimpleTypeRestriction simpleTypeRestriction = simpleType.Content as XmlSchemaSimpleTypeRestriction;
      XmlSchemaSimpleTypeUnion union = simpleType.Content as XmlSchemaSimpleTypeUnion;
      XmlSchemaSimpleTypeList list = simpleType.Content as XmlSchemaSimpleTypeList;

      if (simpleTypeRestriction != null)
      {
        data.AddRange(GetAttributeValueCompletionData(simpleTypeRestriction));
      }
      else if (union != null)
      {
        data.AddRange(GetAttributeValueCompletionData(union));
      }
      else if (list != null)
      {
        data.AddRange(GetAttributeValueCompletionData(list));
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeValueCompletionData(XmlSchemaSimpleTypeUnion union)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      foreach (XmlSchemaObject schemaObject in union.BaseTypes)
      {
        XmlSchemaSimpleType simpleType = schemaObject as XmlSchemaSimpleType;
        if (simpleType != null)
        {
          data.AddRange(GetAttributeValueCompletionData(simpleType));
        }
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeValueCompletionData(XmlSchemaAttribute attribute)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      if (attribute.SchemaType != null)
      {
        XmlSchemaSimpleTypeRestriction simpleTypeRestriction = attribute.SchemaType.Content as XmlSchemaSimpleTypeRestriction;
        XmlSchemaSimpleTypeUnion simpleTypeUnion = attribute.SchemaType.Content as XmlSchemaSimpleTypeUnion;
        if (simpleTypeRestriction != null)
        {
          data.AddRange(GetAttributeValueCompletionData(simpleTypeRestriction));
        }
        else if (simpleTypeUnion != null)
        {
          data.AddRange(GetAttributeValueCompletionData(simpleTypeUnion));
        }
      }
      else if (attribute.AttributeSchemaType != null)
      {
        XmlSchemaSimpleType simpleType = attribute.AttributeSchemaType as XmlSchemaSimpleType;

        if (simpleType != null)
        {
          if (simpleType.Name == "boolean")
          {
            data.AddRange(GetBooleanAttributeValueCompletionData());
          }
          else
          {
            data.AddRange(GetAttributeValueCompletionData(simpleType));
          }
        }
      }
      else if (attribute.SchemaTypeName != null && attribute.SchemaTypeName.Name == "Boolean")
      {
        data.AddRange(GetBooleanAttributeValueCompletionData());
      }

      return data;
    }
    XmlCompletionDataCollection GetAttributeValueCompletionData(XmlSchemaElement element, string name)
    {
      XmlCompletionDataCollection data = new XmlCompletionDataCollection();

      XmlSchemaComplexType complexType = GetElementAsComplexType(element);
      if (complexType != null)
      {
        XmlSchemaAttribute attribute = FindAttribute(complexType, name);
        if (attribute != null)
        {
          data.AddRange(GetAttributeValueCompletionData(attribute));
        }
      }

      return data;
    }