protected IList <RssNewsItem> GetNewsItems() { List <RssNewsItem> newsItems; CacheWrapper cacheWrapper = Cache["AbleRssNews"] as CacheWrapper; if (cacheWrapper == null) { XmlDocument AbleRssXml = new XmlDocument(); try { AbleRssXml.Load("http://www.ablecommerce.com/rss/acgold.xml"); } catch { AbleRssXml.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\"?><rss></rss>"); } newsItems = new List <RssNewsItem>(); XmlNodeList nodes = AbleRssXml.SelectNodes("rss/channel/item"); int itemsCount = 0; foreach (XmlNode node in nodes) { XmlElement ele = (XmlElement)node; RssNewsItem newsItem = new RssNewsItem(); newsItem.PubDate = AlwaysConvert.ToDateTime(XmlUtility.GetElementValue(ele, "pubDate"), DateTime.UtcNow); newsItem.Link = XmlUtility.GetElementValue(ele, "link"); newsItem.Title = XmlUtility.GetElementValue(ele, "title"); newsItem.Description = XmlUtility.GetElementValue(ele, "description"); newsItems.Add(newsItem); if (++itemsCount > 2) { break; } } cacheWrapper = new CacheWrapper(newsItems); Cache.Remove("AbleRssNews"); Cache.Add("AbleRssNews", cacheWrapper, null, DateTime.UtcNow.AddDays(1), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal, null); } else { newsItems = cacheWrapper.CacheValue as List <RssNewsItem>; } return(newsItems); }
/// <summary> /// Helper. node.ChildNodes[0].InnerText + ">>" + node.Attributes["href"].Value + "; " + Environment.NewLine; /// </summary> /// <param name="node"></param> /// <param name="fetchDate"></param> /// <returns></returns> RssNewsItem CreateNewsItem(HtmlNode node, bool fetchDateAndDetails) { RssNewsItem item = new RssNewsItem(this); item.Author = "Bloomberg"; item.Comments = ""; if (node.ParentNode.Name == "p" && node.ParentNode.ChildNodes[2].Name == "#text") {// Description available in parent. item.Description = GeneralHelper.RepairHTMLString(node.ParentNode.ChildNodes[2].InnerText); item.Description = item.Description.Replace("\n", " "); } else { item.Description = ""; } item.Link = new Uri(BaseAddress + node.Attributes["href"].Value); item.Title = node.ChildNodes[0].InnerText; if (fetchDateAndDetails) { HtmlDocument document = GenerateDocument(item.Link.AbsoluteUri); if (document == null) { return(null); } HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//i"); foreach (HtmlNode iNode in nodes) { string dateTimeInfo = iNode.ChildNodes[0].InnerText; DateTime time = GeneralHelper.ParseDateTimeWithZone(dateTimeInfo.Replace("Last Updated:", "")); item.DateTime = time; } } return(item); }
/// <summary> /// Result is new items found on page. /// </summary> /// <param name="uri"></param> List <RssNewsItem> ProcessPage(string uri, int channelId) { List <RssNewsItem> result = new List <RssNewsItem>(); HtmlDocument document = GenerateDocument(uri); if (document == null) { return(result); } foreach (HtmlNode node in document.DocumentNode.SelectNodes("//a[@class]")) { if (node.ParentNode.Name == "p" && node.ParentNode.Attributes["class"] != null && node.ParentNode.Attributes["class"].Value == "summ") { string itemTitle = node.ChildNodes[0].InnerText; lock (this) { if (_latestNewsItemsTitles.ContainsKey(itemTitle)) {// News already listed. continue; } RssNewsItem item = CreateNewsItem(node, true); if (item != null) { _latestNewsItemsTitles.Add(itemTitle, item); item.ChannelId = channelId; result.Add(item); } } } } return(result); }