Defines a Mime Content Type
		/// <summary>Read Element named mime-type. </summary>
		private MimeType ReadMimeType(XmlElement element)
		{
			String name = null;
			String description = null;
			MimeType type;
			XmlNamedNodeMap attrs = element.Attributes;
			for (int i = 0; i < attrs.Count; i++)
			{
				XmlAttribute attr = (XmlAttribute) attrs.Item(i);
				if (attr.Name.Equals("name"))
				{
					name = attr.Value;
				}
				else if (attr.Name.Equals("description"))
				{
					description = attr.Value;
				}
			}
			if ((name == null) || (name.Trim().Equals("")))
			{
				return null;
			}

			try
			{
				//Trace.WriteLine("Mime type:" + name);
				type = new MimeType(name);
			}
			catch (MimeTypeException mte)
			{
				// Mime Type not valid... just ignore it
				Trace.WriteLine(mte.ToString() + " ... Ignoring!");
				return null;
			}

			type.Description = description;

			XmlNodeList nodes = element.ChildNodes;
			for (int i = 0; i < nodes.Count; i++)
			{
				XmlNode node = nodes.Item(i);
				if (Convert.ToInt16(node.NodeType) == (short) XmlNodeType.Element)
				{
					XmlElement nodeElement = (XmlElement) node;
					if (nodeElement.Name.Equals("ext"))
					{
						ReadExt(nodeElement, type);
					}
					else if (nodeElement.Name.Equals("magic"))
					{
						ReadMagic(nodeElement, type);
					}
				}
			}
			return type;
		}
		/// <summary>Read Element named magic. </summary>
		private void ReadMagic(XmlElement element, MimeType mimeType)
		{
			// element.getValue();
			String offset = null;
			String content = null;
			String type = null;
			var attrs = element.Attributes;
			for (int i = 0; i < attrs.Count; i++)
			{
				XmlAttribute attr = (XmlAttribute) attrs.Item(i);
				if (attr.Name.Equals("offset"))
				{
					offset = attr.Value;
				}
				else if (attr.Name.Equals("type"))
				{
					type = attr.Value;
					if (String.Compare(type, "byte", true) == 0)
					{
						type = "System.Byte";
					}
				}
				else if (attr.Name.Equals("value"))
				{
					content = attr.Value;
				}
			}
			if ((offset != null) && (content != null))
			{
				mimeType.AddMagic(Int32.Parse(offset), type, content);
			}
		}
		/// <summary> Add the specified mime-type in the repository.</summary>
		/// <param name="type">is the mime-type to add.
		/// </param>
		internal void Add(MimeType type)
		{
			_typesIdx[type.Name] = type;
			_types.Add(type);
			// Update minLentgth
			_minLength = Math.Max(_minLength, type.MinLength);
			// Update the extensions index...
			String[] exts = type.Extensions;
			if (exts != null)
			{
				foreach (string ext in exts)
				{
					IList list = (IList) _extIdx[ext];
					if (list == null)
					{
						// No type already registered for this extension...
						// So, create a list of types
						list = new ArrayList();
						_extIdx[ext] = list;
					}
					list.Add(type);
				}
			}
			// Update the magics index...
			if (type.HasMagic())
			{
				_mimeTypes.Add(type);
			}
		}
		/// <summary>Read Element named ext. </summary>
		private void ReadExt(XmlElement element, MimeType type)
		{
			XmlNodeList nodes = element.ChildNodes;
			for (int i = 0; i < nodes.Count; i++)
			{
				XmlNode node = nodes.Item(i);
				if (Convert.ToInt16(node.NodeType) == (short) XmlNodeType.Text)
				{
					type.AddExtension(((XmlText) node).Data);
				}
			}
		}
		/// <summary> Add the specified mime-types in the repository.</summary>
		/// <param name="types">are the mime-types to add.
		/// </param>
		internal void Add(MimeType[] types)
		{
			if (types == null)
			{
				return;
			}
			foreach (MimeType t in types)
			{
				Add(t);
			}
		}