/// <summary>
        /// </summary>
        /// <param name="prefix"> </param>
        /// <param name="tag"> </param>
        /// <param name="ns"> </param>
        /// <returns> </returns>
        public static Element GetElement(string prefix, string tag, string ns)
        {
            if (ns == null)
            {
                ns = string.Empty;
            }

            var et = new ElementType(tag, ns);
            var key = et.ToString();

            Element ret;
            if (m_table.ContainsKey(key))
            {
                ret = (Element) Activator.CreateInstance(m_table[key]);
            }
            else
            {
                ret = new Element(tag);
            }

            ret.Prefix = prefix;

            if (ns != string.Empty)
            {
                ret.Namespace = ns;
            }

            return ret;
        }
        /// <summary>
        /// </summary>
        /// <param name="prefix"> </param>
        /// <param name="tag"> </param>
        /// <param name="ns"> </param>
        /// <returns> </returns>
        public static Element GetElement(string prefix, string tag, string ns)
        {
            if (ns == null)
            {
                ns = string.Empty;
            }

            var et = new ElementType(tag, ns);
            var t = (Type) m_table[et.ToString()];

            Element ret;
            if (t != null)
            {
                ret = (Element) Activator.CreateInstance(t);
            }
            else
            {
                ret = new Element(tag);
            }

            ret.Prefix = prefix;

            if (ns != string.Empty)
            {
                ret.Namespace = ns;
            }

            return ret;
        }
        /// <summary>
        ///   Adds new Element Types to the Hashtable Use this function also to register your own created Elements. If a element is already registered it gets overwritten. This behaviour is also useful if you you want to overwrite classes and add your own derived classes to the factory.
        /// </summary>
        /// <param name="tag"> FQN </param>
        /// <param name="ns"> </param>
        /// <param name="t"> </param>
        public static void AddElementType(string tag, string ns, Type t)
        {
            var et = new ElementType(tag, ns);
            string key = et.ToString();

            // added thread safety on a user request
            lock (m_table)
            {
                m_table[key] = t;
            }
        }
        /// <summary>
        ///   Adds new Element Types to the Hashtable Use this function also to register your own created Elements. If a element is already registered it gets overwritten. This behaviour is also useful if you you want to overwrite classes and add your own derived classes to the factory.
        /// </summary>
        /// <param name="tag"> FQN </param>
        /// <param name="ns"> </param>
        /// <param name="t"> </param>
        public static void AddElementType(string tag, string ns, Type t)
        {
            var et = new ElementType(tag, ns);
            string key = et.ToString();

            // added thread safety on a user request
            lock (m_table)
            {
                if (m_table.ContainsKey(key))
                {
                    m_table[key] = t;
                }
                else
                {
                    m_table.Add(et.ToString(), t);
                }
            }
        }