/// <summary>
        /// Creates an Xml Attribute.
        /// </summary>
        /// <param name="name">
        /// The name of the attribute.
        /// </param>
        /// <param name="value">
        /// The value of the attribute.
        /// </param>
        /// <returns>
        /// The new attribute.
        /// </returns>
        private DynaXmlAttribute CreateAttribute(string name, string value)
        {
            DynaXmlAttribute retval;
            var currentAlias = this.CurrentNamespaceContext.CurrentAlias;

            if (!this.CurrentNamespaceContext.ApplyCurrentToAttributes)
            {
                retval = new DynaXmlAttribute()
                {
                    LocalName = name
                };
            }
            else
            {
                retval = new DynaXmlAttribute()
                {
                    Prefix       = currentAlias,
                    LocalName    = name,
                    XmlNamespace = this.CurrentNamespaceContext.AliasTable[currentAlias]
                };
                // We've used the current alias so remove it as it is a (use once state)
                this.CurrentNamespaceContext.CurrentAlias             = string.Empty;
                this.CurrentNamespaceContext.ApplyCurrentToAttributes = false;
            }
            retval.Value = value;
            return(retval);
        }
        /// <summary>
        /// Creates a new XmlNamespace element.
        /// </summary>
        /// <param name="prefix">The prefix for the namespace.</param>
        /// <param name="xmlNamespace">The namespace.</param>
        /// <returns>A new XmlAttribute representing the namespace.</returns>
        private DynaXmlAttribute CreateNamespace(string prefix, string xmlNamespace)
        {
            DynaXmlAttribute namespaceDefinition = new DynaXmlAttribute()
            {
                Prefix       = "xmlns",
                LocalName    = prefix,
                XmlNamespace = Xmlns
            };

            this.CurrentNamespaceContext.AliasTable.Add(prefix, xmlNamespace);
            namespaceDefinition.Value = xmlNamespace;
            return(namespaceDefinition);
        }
        /// <summary>
        /// Changes the current namespace alias for the current context.
        /// </summary>
        /// <param name="name">
        /// The alias for the new namespace.
        /// </param>
        /// <param name="xmlNamespace">
        /// The namespace Url to apply.
        /// </param>
        /// <returns>
        /// Always true.
        /// </returns>
        private bool NamespaceBuilderInvokeMember(string name, string xmlNamespace)
        {
            // First check to make sure the namespace has not already been defined
            // on this element.  It's okay if it's in the current context, but it
            // cant be on the AncestorElement.
            ICollection <DynaXmlAttribute> currentAttributes;

            if (this.CurrentAncestorElement.IsNotNull())
            {
                currentAttributes = new List <DynaXmlAttribute>();
                foreach (DynaXmlAttribute attrib in this.CurrentAncestorElement.Attributes)
                {
                    currentAttributes.Add(attrib);
                }
            }
            else
            {
                currentAttributes = this.rootNodeNamespaceDefinitions;
            }

            DynaXmlAttribute attribute = (from a in currentAttributes
                                          where a.LocalName == name &&
                                          a.XmlNamespace == Xmlns
                                          select a).FirstOrDefault();

            if (attribute.IsNotNull())
            {
                attribute.Value = xmlNamespace;
            }
            else
            {
                attribute = this.CreateNamespace(name, xmlNamespace);
                if (this.CurrentAncestorElement.IsNotNull())
                {
                    this.CurrentAncestorElement.Items.Add(attribute);
                }
                else
                {
                    this.rootNodeNamespaceDefinitions.Add(attribute);
                }
            }

            // Again we pop the context first.
            this.context.Pop();
            // Then we make the changes in the Namespace area of the context.
            this.CurrentNamespaceContext.AliasTable[name] = xmlNamespace;
            return(true);
        }