Esempio n. 1
0
        private DateTime ParseDate(string p)
        {
            DateTime date = new DateTime();

            try
            {
                date = W3CDateTime.Parse(p.ToString()).DateTime;
            }
            catch (Exception)
            {
                if (p.ToString() == "")
                {
                    date = DateTime.Now;
                }
                else
                {
                    try
                    {
                        date = DateTime.Parse(p.ToString());
                    }
                    catch (Exception)
                    {
                        try
                        {
                            string tmp = p.ToString();
                            tmp  = tmp.Substring(0, tmp.LastIndexOf(" "));
                            tmp += " GMT";
                            date = DateTime.Parse(tmp);
                        }
                        catch {
                            // we have a serious date problem
                            date = DateTime.Now;
                            //exceptions.Add(e);
                        }
                    }
                }
            }
            return(date);
        }
Esempio n. 2
0
        /// <summary>Reads the next RssElement from the stream.</summary>
        /// <returns>An RSS Element</returns>
        /// <exception cref="InvalidOperationException">RssReader has been closed, and can not be read.</exception>
        /// <exception cref="System.IO.FileNotFoundException">RSS file not found.</exception>
        /// <exception cref="System.Xml.XmlException">Invalid XML syntax in RSS file.</exception>
        /// <exception cref="System.IO.EndOfStreamException">Unable to read an RssElement. Reached the end of the stream.</exception>
        public RssElement Read()
        {
            bool       readData     = false;
            bool       pushElement  = true;
            RssElement rssElement   = null;
            int        lineNumber   = -1;
            int        linePosition = -1;

            if (reader == null)
            {
                throw new InvalidOperationException("RssReader has been closed, and can not be read.");
            }

            do
            {
                pushElement = true;
                try
                {
                    readData = reader.Read();
                }
                catch (System.IO.EndOfStreamException e)
                {
                    throw new System.IO.EndOfStreamException("Unable to read an RssElement. Reached the end of the stream.", e);
                }
                catch (System.Xml.XmlException e)
                {
                    if (lineNumber != -1 || linePosition != -1)
                    {
                        if (reader.LineNumber == lineNumber && reader.LinePosition == linePosition)
                        {
                            throw exceptions.LastException;
                        }
                    }

                    lineNumber   = reader.LineNumber;
                    linePosition = reader.LinePosition;

                    exceptions.Add(e); // just add to list of exceptions and continue :)
                }
                if (readData)
                {
                    string readerName = reader.Name.ToLower();
                    switch (reader.NodeType)
                    {
                    case XmlNodeType.Element:
                    {
                        if (reader.IsEmptyElement && reader.AttributeCount == 0)
                        {
                            break;
                        }
                        elementText = new StringBuilder();

                        switch (readerName)
                        {
                        case "item":
                            // is this the end of the channel element? (absence of </channel> before <item>)
                            if (!wroteChannel)
                            {
                                wroteChannel = true;
                                rssElement   = channel;           // return RssChannel
                                readData     = false;
                            }
                            item = new RssItem();             // create new RssItem
                            channel.Items.Add(item);
                            break;

                        //case "source":
                        //    source = new RssSource();
                        //    item.Source = source;
                        //    for (int i = 0; i < reader.AttributeCount; i++)
                        //    {
                        //        reader.MoveToAttribute(i);
                        //        switch (reader.Name.ToLower())
                        //        {
                        //            case "url":
                        //                try
                        //                {
                        //                    source.Url = reader.Value;
                        //                }
                        //                catch (Exception e)
                        //                {
                        //                    exceptions.Add(e);
                        //                }
                        //                break;
                        //        }
                        //    }
                        //    break;
                        //case "pubdate":
                        //    try
                        //    {
                        //        item.PubDate = W3CDateTime.Parse(elementText.ToString()).DateTime;
                        //    }
                        //    catch (Exception e)
                        //    {
                        //        try
                        //        {
                        //            string tmp = elementText.ToString();
                        //            tmp = tmp.Substring(0, tmp.LastIndexOf(" "));
                        //            tmp += " GMT";
                        //            item.PubDate = DateTime.Parse(tmp);
                        //        }
                        //        catch
                        //        {
                        //            exceptions.Add(e);
                        //        }
                        //    }
                        //    break;
                        case "enclosure":
                            enclosure      = new RssEnclosure();
                            item.Enclosure = enclosure;
                            for (int i = 0; i < reader.AttributeCount; i++)
                            {
                                reader.MoveToAttribute(i);
                                switch (reader.Name.ToLower())
                                {
                                case "url":
                                    try
                                    {
                                        enclosure.Url = reader.Value;
                                    }
                                    catch (Exception e)
                                    {
                                        exceptions.Add(e);
                                    }
                                    break;

                                case "length":
                                    try
                                    {
                                        enclosure.Length = int.Parse(reader.Value);
                                    }
                                    catch (Exception)
                                    {
                                        enclosure.Length = 0;
                                        //exceptions.Add(e);
                                    }
                                    break;

                                case "type":
                                    enclosure.Type = reader.Value;
                                    break;
                                }
                            }
                            break;

                        case "guid":
                            guid      = new RssGuid();
                            item.Guid = guid;
                            for (int i = 0; i < reader.AttributeCount; i++)
                            {
                                reader.MoveToAttribute(i);
                                switch (reader.Name.ToLower())
                                {
                                case "ispermalink":
                                    try
                                    {
                                        guid.PermaLink = bool.Parse(reader.Value);
                                    }
                                    catch (Exception e)
                                    {
                                        exceptions.Add(e);
                                    }
                                    break;
                                }
                            }
                            break;

                        case "channel":
                            channel   = new RssChannel();
                            image     = null;
                            enclosure = null;
                            item      = null;
                            break;

                        case "image":
                            image         = new RssImage();
                            channel.Image = image;
                            break;

                        case "rss":
                            for (int i = 0; i < reader.AttributeCount; i++)
                            {
                                reader.MoveToAttribute(i);
                                if (reader.Name.ToLower() == "version")
                                {
                                    switch (reader.Value)
                                    {
                                    case "0.91":
                                        rssVersion = RssVersion.RSS091;
                                        break;

                                    case "0.92":
                                        rssVersion = RssVersion.RSS092;
                                        break;

                                    case "2.0":
                                        rssVersion = RssVersion.RSS20;
                                        break;

                                    default:
                                        rssVersion = RssVersion.NotSupported;
                                        break;
                                    }
                                }
                            }
                            break;

                        case "rdf":
                            for (int i = 0; i < reader.AttributeCount; i++)
                            {
                                reader.MoveToAttribute(i);
                                if (reader.Name.ToLower() == "version")
                                {
                                    switch (reader.Value)
                                    {
                                    case "0.90":
                                        rssVersion = RssVersion.RSS090;
                                        break;

                                    case "1.0":
                                        rssVersion = RssVersion.RSS10;
                                        break;

                                    default:
                                        rssVersion = RssVersion.NotSupported;
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                        if (pushElement)
                        {
                            xmlNodeStack.Push(readerName);
                        }
                        break;
                    }

                    case XmlNodeType.EndElement:
                    {
                        if (xmlNodeStack.Count == 1)
                        {
                            break;
                        }
                        string childElementName  = (string)xmlNodeStack.Pop();
                        string parentElementName = (string)xmlNodeStack.Peek();
                        switch (childElementName)         // current element
                        {
                        // item classes
                        case "item":
                            rssElement = item;
                            readData   = false;
                            break;

                        //case "source":
                        //    source.Name = elementText.ToString();
                        //    rssElement = source;
                        //    readData = false;
                        //    break;
                        case "enclosure":
                            rssElement = enclosure;
                            readData   = false;
                            break;

                        case "guid":
                            guid.Name  = elementText.ToString();
                            rssElement = guid;
                            readData   = false;
                            break;

                        case "pubdate":
                            rssElement = channel;
                            readData   = false;
                            break;

                        case "channel":
                            if (wroteChannel)
                            {
                                wroteChannel = false;
                            }
                            else
                            {
                                wroteChannel = true;
                                rssElement   = channel;
                                readData     = false;
                            }
                            break;
                        }
                        switch (parentElementName)         // parent element
                        {
                        case "item":
                            switch (childElementName)
                            {
                            case "pubdate":
                                try
                                {
                                    item.PubDate = W3CDateTime.Parse(elementText.ToString()).DateTime;
                                }
                                catch (Exception e)
                                {
                                    try
                                    {
                                        string tmp = elementText.ToString();
                                        tmp          = tmp.Substring(0, tmp.LastIndexOf(" "));
                                        tmp         += " GMT";
                                        item.PubDate = DateTime.Parse(tmp);
                                    }
                                    catch
                                    {
                                        exceptions.Add(e);
                                    }
                                }
                                break;

                            case "title":
                                item.Title = elementText.ToString();
                                break;

                            case "link":
                                item.Link = elementText.ToString();
                                break;

                            case "description":
                                item.Description = elementText.ToString();
                                break;
                            }
                            break;

                        case "channel":
                            switch (childElementName)
                            {
                            case "title":
                                channel.Title = elementText.ToString();
                                break;

                            case "link":
                                try
                                {
                                    channel.Link = elementText.ToString();
                                }
                                catch (Exception e)
                                {
                                    exceptions.Add(e);
                                }
                                break;

                            case "description":
                                channel.Description = elementText.ToString();
                                break;

                            case "pubdate":
                                try
                                {
                                    channel.PubDate = W3CDateTime.Parse(elementText.ToString()).DateTime;
                                }
                                catch (Exception)
                                {
                                    if (elementText.ToString() == "")
                                    {
                                        channel.PubDate = DateTime.Now;
                                    }
                                    else
                                    {
                                        try
                                        {
                                            channel.PubDate = DateTime.Parse(elementText.ToString());
                                        }
                                        catch (Exception e)
                                        {
                                            try
                                            {
                                                string tmp = elementText.ToString();
                                                tmp             = tmp.Substring(0, tmp.LastIndexOf(" "));
                                                tmp            += " GMT";
                                                channel.PubDate = DateTime.Parse(tmp);
                                            }
                                            catch
                                            {
                                                exceptions.Add(e);
                                            }
                                        }
                                    }
                                }
                                break;

                            case "lastbuilddate":
                                try
                                {
                                    channel.LastBuildDate = W3CDateTime.Parse(elementText.ToString()).DateTime;
                                    //channel.LastBuildDate = DateTime.Parse(elementText.ToString());
                                }
                                catch (Exception)
                                {
                                    if (elementText.ToString() == "")
                                    {
                                        channel.LastBuildDate = DateTime.Now;
                                    }
                                    else
                                    {
                                        try
                                        {
                                            channel.LastBuildDate = DateTime.Parse(elementText.ToString());
                                        }
                                        catch (Exception e)
                                        {
                                            try
                                            {
                                                string tmp = elementText.ToString();
                                                tmp  = tmp.Substring(0, tmp.LastIndexOf(" "));
                                                tmp += " GMT";
                                                channel.LastBuildDate = DateTime.Parse(tmp);
                                            }
                                            catch
                                            {
                                                exceptions.Add(e);
                                            }
                                        }
                                    }
                                }
                                break;
                            }
                            break;

                        case "image":
                            switch (childElementName)
                            {
                            case "url":
                                try
                                {
                                    image.Url = elementText.ToString();
                                }
                                catch (Exception e)
                                {
                                    exceptions.Add(e);
                                }
                                break;

                            case "title":
                                image.Title = elementText.ToString();
                                break;

                            case "link":
                                try
                                {
                                    image.Link = elementText.ToString();
                                }
                                catch (Exception e)
                                {
                                    exceptions.Add(e);
                                }
                                break;

                            case "content:encoded":
                                item.Content = elementText.ToString();
                                break;

                            case "description":
                                image.Description = elementText.ToString();
                                break;
                            }
                            break;
                        }
                        break;
                    }

                    case XmlNodeType.Text:
                        elementText.Append(reader.Value);
                        break;

                    case XmlNodeType.CDATA:
                        elementText.Append(reader.Value);
                        break;
                    }
                }
            }while (readData);
            return(rssElement);
        }