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); }
/// <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); }