/// <summary>
        /// Converts to I RSS enclosure.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <returns></returns>
        public static IRssEnclosure ConvertToIRssEnclosure(XmlReader input)
        {
            RssEnclosure enc = new RssEnclosure();

            input.ReadToDescendant("enclosure");
            enc.Length = CachedPropertiesProvider.ConvertToInt(input.GetAttribute("length"));
            enc.Link   = CachedPropertiesProvider.ConvertToUri(input.GetAttribute("url"));
            enc.Type   = input.GetAttribute("type");
            input.Close();
            return(enc);
        }
        /// <summary>
        /// Converts to I RSS cloud.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <returns></returns>
        public static IRssCloud ConvertToIRssCloud(XmlReader input)
        {
            RssCloud cloud = new RssCloud();

            input.ReadToDescendant("cloud");
            cloud.Domain            = input.GetAttribute("domain");
            cloud.Port              = CachedPropertiesProvider.ConvertToInt(input.GetAttribute("port"));
            cloud.Path              = input.GetAttribute("path");
            cloud.Protocol          = ConvertToRssCloudProtocol(input.GetAttribute("protocol"));
            cloud.RegisterProcedure = input.GetAttribute("registerProcedure");
            input.Close();
            return(cloud);
        }
        /// <summary>
        /// Converts to I RSS image.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <returns></returns>
        public static IRssImage ConvertToIRssImage(XmlReader input)
        {
            RssImage image = new RssImage();

            input.ReadToDescendant("image");

            bool readContent = false;

            while (readContent || input.Read())
            {
                readContent = false;
                if (input.NodeType == XmlNodeType.Element)
                {
                    readContent = true;
                    switch (input.Name)
                    {
                    case "description":
                        image.Description = input.ReadElementContentAsString();
                        break;

                    case "link":
                        image.Link = CachedPropertiesProvider.ConvertToUri(input.ReadElementContentAsString());
                        break;

                    case "location":
                        image.Location = CachedPropertiesProvider.ConvertToUri(input.ReadElementContentAsString());
                        break;

                    case "title":
                        image.Title = input.ReadElementContentAsString();
                        break;

                    case "width":
                        image.Width = CachedPropertiesProvider.ConvertToInt(input.ReadElementContentAsString());
                        break;

                    case "height":
                        image.Height = CachedPropertiesProvider.ConvertToInt(input.ReadElementContentAsString());
                        break;

                    default:
                        readContent = false;
                        break;
                    }
                }
            }
            input.Close();
            return(image);
        }
        /// <summary>
        /// Parses the specified reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns></returns>
        public override T Parse <T>(System.Xml.XmlReader reader)
        {
            IRssFeed ret = (IRssFeed) new RssFeed();

            reader.Read();

            // RDF versions of RSS don't have version tags.
            //double version = double.Parse(reader.GetAttribute("version"));

            reader.ReadToDescendant("channel");

            bool readContent = false;

            while (readContent || reader.Read())
            {
                readContent = false;
                if (reader.NodeType == XmlNodeType.Element)
                {
                    readContent = true;
                    switch (reader.Name)
                    {
                    case "title":
                        ret.Title = reader.ReadElementContentAsString();
                        break;

                    case "link":
                        ret.FeedUri = CachedPropertiesProvider.ConvertToUri(reader.ReadElementContentAsString());
                        break;

                    case "description":
                        ret.Description = reader.ReadElementContentAsString();
                        break;

                    case "language":
                        ret.Culture = CachedPropertiesProvider.ConvertToCultureInfo(reader.ReadElementContentAsString());
                        break;

                    case "copyright":
                        ret.Copyright = reader.ReadElementContentAsString();
                        break;

                    case "managingEditor":
                        ret.ManagingEditor = reader.ReadElementContentAsString();
                        break;

                    case "webMaster":
                        ret.WebMaster = reader.ReadElementContentAsString();
                        break;

                    case "pubDate":
                        ret.PublicationDate = CachedPropertiesProvider.ConvertToTzDateTime(reader.ReadElementContentAsString());
                        break;

                    case "lastBuildDate":
                        ret.LastChanged = CachedPropertiesProvider.ConvertToTzDateTime(reader.ReadElementContentAsString());
                        break;

                    case "category":
                        using (XmlReader subReader = reader.ReadSubtree())
                        {
                            ret.Category = ConvertToIRssCategory(subReader);
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    case "generator":
                        ret.Generator = reader.ReadElementContentAsString();
                        break;

                    case "docs":
                        ret.Doc = CachedPropertiesProvider.ConvertToUri(reader.ReadElementContentAsString());
                        break;

                    case "cloud":
                        using (XmlReader subReader = reader.ReadSubtree())
                        {
                            ret.Cloud = ConvertToIRssCloud(subReader);
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    case "ttl":
                        ret.TimeToLive = CachedPropertiesProvider.ConvertToInt(reader.ReadElementContentAsString());
                        break;

                    case "image":
                        using (XmlReader subReader = reader.ReadSubtree())
                        {
                            ret.Image = ConvertToIRssImage(subReader);
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    /*case "rating":
                     *  break;*/
                    case "textInput":
                        using (XmlReader subReader = reader.ReadSubtree())
                        {
                            ret.TextInput = ConvertToIRssTextInput(subReader);
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    case "skipHours":
                        using (XmlReader subReader = reader.ReadSubtree())
                        {
                            ret.SkipHours = ConvertToSkipHourList(subReader);
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    case "skipDays":
                        using (XmlReader subReader = reader.ReadSubtree())
                        {
                            ret.SkipDays = ConvertToDayOfWeekList(subReader);
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    case "item":
                        using (XmlReader itemReader = reader.ReadSubtree())
                        {
                            ret.Items.Add(ParseItem(itemReader));
                        }
                        if (reader.IsEmptyElement)
                        {
                            readContent = false;
                        }
                        break;

                    default:
                        UnhandledElement(ret, reader);
                        break;
                    }
                }
            }
            reader.Close();
            return((T)ret);
        }