PageRenderTime 26ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/branches/1.6.2/InfoService/InfoService/Feeds/FeedReader/Xml/FeedRdfXmlParser.cs

#
C# | 124 lines | 98 code | 11 blank | 15 comment | 14 complexity | 8e69395b350c5d62d8413f9861c57879 MD5 | raw file
  1. #region Usings
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml.Linq;
  7. using FeedReader.Data;
  8. using FeedReader.Enums;
  9. #endregion
  10. namespace FeedReader.Xml
  11. {
  12. internal static class FeedRdfXmlParser
  13. {
  14. private static string _cacheFolder;
  15. private static bool _useCache;
  16. internal static bool TryParse(XDocument xmlFeed, ref Feed feed, string cacheFolder, bool downloadImages, List<FeedItemFilter> itemFilters)
  17. {
  18. _cacheFolder = cacheFolder;
  19. _useCache = true;
  20. return TryParse(xmlFeed, ref feed, downloadImages, itemFilters);
  21. }
  22. internal static bool TryParse(XDocument xmlFeed, ref Feed feed, bool downloadImages, List<FeedItemFilter> itemFilters)
  23. {
  24. Feed rFeed = feed;
  25. XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
  26. XElement element = xmlFeed.Element(rdf + "RDF");
  27. if (element != null)
  28. {
  29. LogEvents.InvokeOnDebug(new FeedArgs("The feed is a RDF feed. Now parsing the xml data"));
  30. XNamespace dc = "http://purl.org/dc/elements/1.1/";
  31. XNamespace d = "http://purl.org/rss/1.0/";
  32. XNamespace nsContent = "http://purl.org/rss/1.0/modules/content/";
  33. XNamespace nsImage = "http://purl.org/rss/1.0/modules/image/";
  34. rFeed.ImagePath =
  35. FeedXmlParser.ParseString(
  36. xmlFeed.Descendants(d + "channel").Elements(d + "image").Attributes("resource"), "channel/image/attribute[resource]");
  37. rFeed.Description =
  38. Utils.Clean(FeedXmlParser.ParseString(xmlFeed.Descendants(d + "channel").Elements(d + "description"), "channel/description"));
  39. rFeed.Title =
  40. Utils.Clean(FeedXmlParser.ParseString(xmlFeed.Descendants(d + "channel").Elements(d + "title"), "channel/title"));
  41. try
  42. {
  43. FeedItem feedItem;
  44. int i = 1;
  45. foreach (XElement item in xmlFeed.Descendants(d + "item"))
  46. {
  47. feedItem = new FeedItem();
  48. feedItem.Author = Utils.Clean(FeedXmlParser.ParseString(item.Element(d + "author"), "item[" + i + "]/author"));
  49. feedItem.Title = Utils.Clean(FeedXmlParser.ParseString(item.Element(d + "title"), "item[" + i + "]/title"), true, false, true, true, itemFilters);
  50. feedItem.Url = FeedXmlParser.ParseString(item.Element(d + "link"), "item[" + i + "]/link").Trim();
  51. feedItem.PublishDate = FeedXmlParser.ParseDateTime(item.Element(dc + "date"), "item[" + i + "]/date");
  52. LogEvents.InvokeOnDebug(new FeedArgs("Try to get feed[" + rFeed.Title + "][" + feedItem.Title + "][" + i + "] item image..."));
  53. feedItem.ImagePath = FeedXmlParser.ParseString(item.Element(nsImage + "item"), d + "about", "item[" + i + "]/attribute[about]");
  54. if (Path.GetExtension(feedItem.ImagePath) == ".gif" || Path.GetExtension(feedItem.ImagePath) == ".bmp" ||
  55. Path.GetExtension(feedItem.ImagePath) == ".jpg" || Path.GetExtension(feedItem.ImagePath) == ".png" ||
  56. Path.GetExtension(feedItem.ImagePath) == ".jpeg")
  57. {
  58. LogEvents.InvokeOnDebug(new FeedArgs("Enclosure of feed[" + rFeed.Title + "][" + feedItem.Title + "][" + i + "] item is an image. Parse image url..."));
  59. }
  60. else
  61. {
  62. LogEvents.InvokeOnDebug(new FeedArgs("Enclosure of feed[" + rFeed.Title + "][" + feedItem.Title + "][" + i + "] item is not an image. Skipping parsing image url..."));
  63. feedItem.ImagePath = string.Empty;
  64. }
  65. string description = FeedXmlParser.ParseString(item.Element(d + "description"), "item[" + i + "]/description");
  66. description = Utils.Clean(description, false, true, true, false, itemFilters);
  67. if (string.IsNullOrEmpty(feedItem.ImagePath))
  68. {
  69. LogEvents.InvokeOnDebug(new FeedArgs("Try to get feed[" + rFeed.Title + "][" + feedItem.Title + "][" + i + "] image out of description field..."));
  70. feedItem.ImagePath = Utils.GetImageOutOfDescription(description);
  71. }
  72. feedItem.Description = Utils.Clean(description, false, true, false, true, itemFilters) == "" ?
  73. Utils.Clean(Utils.GetCdata(FeedXmlParser.ParseString(item.Element(nsContent + "encoded"), "item[" + i + "]/encoded")), false, true, false, true, itemFilters) :
  74. Utils.Clean(description, false, true, false, true, itemFilters);
  75. rFeed.Items.Add(feedItem);
  76. i++;
  77. }
  78. /* rFeed.Items = (from item in xmlFeed.Descendants(d + "item")
  79. select new FeedItem
  80. {
  81. Author = FeedXmlParser.ParseString(item.Element(d + "author"), "item/author"),
  82. Title =
  83. Utils.Clean(FeedXmlParser.ParseString(item.Element(d + "title"), "item/title")),
  84. UrlPath = FeedXmlParser.ParseString(item.Element(d + "link"), "item/link"),
  85. PublishDate = FeedXmlParser.ParseDateTime(item.Element(dc + "date"), "item/date"),
  86. Description = Utils.Clean(FeedXmlParser.ParseString(item.Element(d + "description"), "item/description")) == "" ?
  87. Utils.Clean(Utils.GetCdata(FeedXmlParser.ParseString(item.Element(nsContent + "encoded"), "item/encoded"))):
  88. Utils.Clean(FeedXmlParser.ParseString(item.Element(d + "description"), "item/description")),
  89. ImagePath = FeedXmlParser.ParseString(item.Element(nsImage + "item"), d + "about", "item/attribute[about]"),
  90. }).OrderByDescending(feedItem => feedItem.PublishDate).ToList();*/
  91. if (downloadImages)
  92. {
  93. LogEvents.InvokeOnInfo(new FeedArgs("Try to get feed images either from cache or from download links"));
  94. feed = _useCache ? Utils.DownloadImages(rFeed, _cacheFolder) : Utils.DownloadImages(rFeed);
  95. }
  96. else feed = rFeed;
  97. feed.Items = feed.Items.OrderByDescending(fItem => fItem.PublishDate).ToList();
  98. LogEvents.InvokeOnDebug(new FeedArgs("Parsing of RDF feed done. See above for possibly errors or warnings"));
  99. return true;
  100. }
  101. catch (Exception ex)
  102. {
  103. LogEvents.InvokeOnError(new FeedArgs("Error parsing RDF feed", ex.Message, ex.StackTrace));
  104. //feed = null;
  105. return false;
  106. }
  107. }
  108. LogEvents.InvokeOnDebug(new FeedArgs("This is not a RDF feed or the downloaded xml file is not a valid feed"));
  109. //feed = null;
  110. return false;
  111. }
  112. }
  113. }