/// <summary> /// Initializes the supplied <see cref="RssChannel"/> using the specified <see cref="XPathNavigator"/> and <see cref="XmlNamespaceManager"/>. /// </summary> /// <param name="channel">The <see cref="RssChannel"/> to be filled.</param> /// <param name="navigator">The <see cref="XPathNavigator"/> used to navigate the channel XML data.</param> /// <param name="manager">The <see cref="XmlNamespaceManager"/> used to resolve XML namespace prefixes.</param> /// <param name="settings">The <see cref="SyndicationResourceLoadSettings"/> object used to configure the load operation.</param> /// <exception cref="ArgumentNullException">The <paramref name="channel"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="navigator"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="manager"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="settings"/> is a null reference (Nothing in Visual Basic).</exception> private static void FillChannel(RssChannel channel, XPathNavigator navigator, XmlNamespaceManager manager, SyndicationResourceLoadSettings settings) { Guard.ArgumentNotNull(channel, "channel"); Guard.ArgumentNotNull(navigator, "navigator"); Guard.ArgumentNotNull(manager, "manager"); Guard.ArgumentNotNull(settings, "settings"); XPathNavigator descriptionNavigator = navigator.SelectSingleNode("description", manager); XPathNavigator linkNavigator = navigator.SelectSingleNode("link", manager); XPathNavigator titleNavigator = navigator.SelectSingleNode("title", manager); XPathNavigator languageNavigator = navigator.SelectSingleNode("language", manager); if (descriptionNavigator != null && !String.IsNullOrEmpty(descriptionNavigator.Value)) { channel.Description = descriptionNavigator.Value; } if (linkNavigator != null) { Uri link; if (Uri.TryCreate(linkNavigator.Value, UriKind.RelativeOrAbsolute, out link)) { channel.Link = link; } } if (titleNavigator != null && !String.IsNullOrEmpty(titleNavigator.Value)) { channel.Title = titleNavigator.Value; } if (languageNavigator != null && !String.IsNullOrEmpty(languageNavigator.Value)) { try { CultureInfo language = new CultureInfo(languageNavigator.Value); channel.Language = language; } catch (ArgumentException) { System.Diagnostics.Trace.TraceWarning("Rss092SyndicationResourceAdapter unable to determine CultureInfo with a name of {0}.", languageNavigator.Value); } } XPathNavigator imageNavigator = navigator.SelectSingleNode("image", manager); if (imageNavigator != null) { channel.Image = new RssImage(); Rss092SyndicationResourceAdapter.FillImage(channel.Image, imageNavigator, manager, settings); } Rss092SyndicationResourceAdapter.FillChannelOptionals(channel, navigator, manager, settings); Rss092SyndicationResourceAdapter.FillChannelCollections(channel, navigator, manager, settings); SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(navigator, settings); adapter.Fill(channel); }
//============================================================ // PUBLIC METHODS //============================================================ #region Fill(RssFeed resource) /// <summary> /// Modifies the <see cref="RssFeed"/> to match the data source. /// </summary> /// <param name="resource">The <see cref="RssFeed"/> to be filled.</param> /// <exception cref="ArgumentNullException">The <paramref name="resource"/> is a null reference (Nothing in Visual Basic).</exception> public void Fill(RssFeed resource) { //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNull(resource, "resource"); //------------------------------------------------------------ // Create namespace resolver //------------------------------------------------------------ XmlNamespaceManager manager = new XmlNamespaceManager(this.Navigator.NameTable); //------------------------------------------------------------ // Attempt to fill syndication resource //------------------------------------------------------------ XPathNavigator feedNavigator = this.Navigator.SelectSingleNode("rss", manager); if (feedNavigator != null) { XPathNavigator channelNavigator = feedNavigator.SelectSingleNode("channel", manager); if (channelNavigator != null) { Rss092SyndicationResourceAdapter.FillChannel(resource.Channel, channelNavigator, manager, this.Settings); } SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(feedNavigator, this.Settings); adapter.Fill(resource, manager); } }
/// <summary> /// Modifies the <see cref="ISyndicationResource"/> to match the data source. /// </summary> /// <param name="resource">The Really Simple Syndication (RSS) <see cref="ISyndicationResource"/> to be filled.</param> /// <param name="resourceMetadata">A <see cref="SyndicationResourceMetadata"/> object that represents the meta-data describing the <paramref name="resource"/>.</param> /// <exception cref="ArgumentNullException">The <paramref name="resource"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="resourceMetadata"/> is a null reference (Nothing in Visual Basic).</exception> private void FillRssResource(ISyndicationResource resource, SyndicationResourceMetadata resourceMetadata) { //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNull(resource, "resource"); Guard.ArgumentNotNull(resourceMetadata, "resourceMetadata"); //------------------------------------------------------------ // Fill syndication resource using appropriate data adapter //------------------------------------------------------------ RssFeed rssFeed = resource as RssFeed; if (resourceMetadata.Version == new Version("2.0")) { Rss20SyndicationResourceAdapter rss20Adapter = new Rss20SyndicationResourceAdapter(this.Navigator, this.Settings); rss20Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("1.0")) { Rss10SyndicationResourceAdapter rss10Adapter = new Rss10SyndicationResourceAdapter(this.Navigator, this.Settings); rss10Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("0.92")) { Rss092SyndicationResourceAdapter rss092Adapter = new Rss092SyndicationResourceAdapter(this.Navigator, this.Settings); rss092Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("0.91")) { Rss091SyndicationResourceAdapter rss091Adapter = new Rss091SyndicationResourceAdapter(this.Navigator, this.Settings); rss091Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("0.9")) { Rss090SyndicationResourceAdapter rss090Adapter = new Rss090SyndicationResourceAdapter(this.Navigator, this.Settings); rss090Adapter.Fill(rssFeed); } }
/// <summary> /// Modifies the <see cref="RssFeed"/> to match the data source. /// </summary> /// <param name="resource">The <see cref="RssFeed"/> to be filled.</param> /// <exception cref="ArgumentNullException">The <paramref name="resource"/> is a null reference (Nothing in Visual Basic).</exception> public void Fill(RssFeed resource) { Guard.ArgumentNotNull(resource, "resource"); XmlNamespaceManager manager = new XmlNamespaceManager(this.Navigator.NameTable); XPathNavigator feedNavigator = this.Navigator.SelectSingleNode("rss", manager); if (feedNavigator != null) { XPathNavigator channelNavigator = feedNavigator.SelectSingleNode("channel", manager); if (channelNavigator != null) { Rss092SyndicationResourceAdapter.FillChannel(resource.Channel, channelNavigator, manager, this.Settings); } SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(feedNavigator, this.Settings); adapter.Fill(resource, manager); } }
/// <summary> /// Modifies the <see cref="ISyndicationResource"/> to match the data source. /// </summary> /// <param name="resource">The Really Simple Syndication (RSS) <see cref="ISyndicationResource"/> to be filled.</param> /// <param name="resourceMetadata">A <see cref="SyndicationResourceMetadata"/> object that represents the meta-data describing the <paramref name="resource"/>.</param> /// <exception cref="ArgumentNullException">The <paramref name="resource"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="resourceMetadata"/> is a null reference (Nothing in Visual Basic).</exception> private void FillRssResource(ISyndicationResource resource, SyndicationResourceMetadata resourceMetadata) { Guard.ArgumentNotNull(resource, "resource"); Guard.ArgumentNotNull(resourceMetadata, "resourceMetadata"); RssFeed rssFeed = resource as RssFeed; if (resourceMetadata.Version == new Version("2.0")) { Rss20SyndicationResourceAdapter rss20Adapter = new Rss20SyndicationResourceAdapter(this.Navigator, this.Settings); rss20Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("1.0")) { Rss10SyndicationResourceAdapter rss10Adapter = new Rss10SyndicationResourceAdapter(this.Navigator, this.Settings); rss10Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("0.92")) { Rss092SyndicationResourceAdapter rss092Adapter = new Rss092SyndicationResourceAdapter(this.Navigator, this.Settings); rss092Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("0.91")) { Rss091SyndicationResourceAdapter rss091Adapter = new Rss091SyndicationResourceAdapter(this.Navigator, this.Settings); rss091Adapter.Fill(rssFeed); } if (resourceMetadata.Version == new Version("0.9")) { Rss090SyndicationResourceAdapter rss090Adapter = new Rss090SyndicationResourceAdapter(this.Navigator, this.Settings); rss090Adapter.Fill(rssFeed); } }
/// <summary> /// Initializes the supplied <see cref="RssItem"/> using the specified <see cref="XPathNavigator"/> and <see cref="XmlNamespaceManager"/>. /// </summary> /// <param name="item">The <see cref="RssItem"/> to be filled.</param> /// <param name="navigator">The <see cref="XPathNavigator"/> used to navigate the item XML data.</param> /// <param name="manager">The <see cref="XmlNamespaceManager"/> used to resolve XML namespace prefixes.</param> /// <param name="settings">The <see cref="SyndicationResourceLoadSettings"/> object used to configure the load operation.</param> /// <exception cref="ArgumentNullException">The <paramref name="item"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="navigator"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="manager"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="settings"/> is a null reference (Nothing in Visual Basic).</exception> private static void FillItem(RssItem item, XPathNavigator navigator, XmlNamespaceManager manager, SyndicationResourceLoadSettings settings) { Guard.ArgumentNotNull(item, "item"); Guard.ArgumentNotNull(navigator, "navigator"); Guard.ArgumentNotNull(manager, "manager"); Guard.ArgumentNotNull(settings, "settings"); XPathNavigator titleNavigator = navigator.SelectSingleNode("title", manager); XPathNavigator linkNavigator = navigator.SelectSingleNode("link", manager); XPathNavigator descriptionNavigator = navigator.SelectSingleNode("description", manager); XPathNavigator sourceNavigator = navigator.SelectSingleNode("source", manager); XPathNodeIterator enclosureIterator = navigator.Select("enclosure", manager); XPathNodeIterator categoryIterator = navigator.Select("category", manager); if (titleNavigator != null) { item.Title = titleNavigator.Value; } if (descriptionNavigator != null) { item.Description = descriptionNavigator.Value; } if (linkNavigator != null) { Uri link; if (Uri.TryCreate(linkNavigator.Value, UriKind.RelativeOrAbsolute, out link)) { item.Link = link; } } if (sourceNavigator != null) { item.Source = new RssSource(); if (sourceNavigator.HasAttributes) { string urlAttribute = sourceNavigator.GetAttribute("url", String.Empty); Uri url; if (Uri.TryCreate(urlAttribute, UriKind.RelativeOrAbsolute, out url)) { item.Source.Url = url; } } if (!String.IsNullOrEmpty(sourceNavigator.Value)) { item.Source.Title = sourceNavigator.Value; } } if (enclosureIterator != null && enclosureIterator.Count > 0) { while (enclosureIterator.MoveNext()) { RssEnclosure enclosure = new RssEnclosure(); Rss092SyndicationResourceAdapter.FillEnclosure(enclosure, enclosureIterator.Current, manager, settings); item.Enclosures.Add(enclosure); } } if (categoryIterator != null && categoryIterator.Count > 0) { while (categoryIterator.MoveNext()) { RssCategory category = new RssCategory(); Rss092SyndicationResourceAdapter.FillCategory(category, categoryIterator.Current, manager, settings); item.Categories.Add(category); } } SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(navigator, settings); adapter.Fill(item); }
/// <summary> /// Initializes the supplied <see cref="RssChannel"/> optional entities using the specified <see cref="XPathNavigator"/> and <see cref="XmlNamespaceManager"/>. /// </summary> /// <param name="channel">The <see cref="RssChannel"/> to be filled.</param> /// <param name="navigator">The <see cref="XPathNavigator"/> used to navigate the channel XML data.</param> /// <param name="manager">The <see cref="XmlNamespaceManager"/> used to resolve XML namespace prefixes.</param> /// <param name="settings">The <see cref="SyndicationResourceLoadSettings"/> object used to configure the load operation.</param> /// <exception cref="ArgumentNullException">The <paramref name="channel"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="navigator"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="manager"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="settings"/> is a null reference (Nothing in Visual Basic).</exception> private static void FillChannelOptionals(RssChannel channel, XPathNavigator navigator, XmlNamespaceManager manager, SyndicationResourceLoadSettings settings) { Guard.ArgumentNotNull(channel, "channel"); Guard.ArgumentNotNull(navigator, "navigator"); Guard.ArgumentNotNull(manager, "manager"); Guard.ArgumentNotNull(settings, "settings"); XPathNavigator copyrightNavigator = navigator.SelectSingleNode("copyright", manager); XPathNavigator managingEditorNavigator = navigator.SelectSingleNode("managingEditor", manager); XPathNavigator webMasterNavigator = navigator.SelectSingleNode("webMaster", manager); XPathNavigator ratingNavigator = navigator.SelectSingleNode("rating", manager); XPathNavigator publicationNavigator = navigator.SelectSingleNode("pubDate", manager); XPathNavigator lastBuildDateNavigator = navigator.SelectSingleNode("lastBuildDate", manager); XPathNavigator textInputNavigator = navigator.SelectSingleNode("textInput", manager); XPathNavigator cloudNavigator = navigator.SelectSingleNode("cloud", manager); if (copyrightNavigator != null) { channel.Copyright = copyrightNavigator.Value; } if (managingEditorNavigator != null) { channel.ManagingEditor = managingEditorNavigator.Value; } if (webMasterNavigator != null) { channel.Webmaster = webMasterNavigator.Value; } if (ratingNavigator != null) { channel.Rating = ratingNavigator.Value; } if (publicationNavigator != null) { DateTime publicationDate; if (SyndicationDateTimeUtility.TryParseRfc822DateTime(publicationNavigator.Value, out publicationDate)) { channel.PublicationDate = publicationDate; } } if (lastBuildDateNavigator != null) { DateTime lastBuildDate; if (SyndicationDateTimeUtility.TryParseRfc822DateTime(lastBuildDateNavigator.Value, out lastBuildDate)) { channel.LastBuildDate = lastBuildDate; } } if (textInputNavigator != null) { channel.TextInput = new RssTextInput(); Rss092SyndicationResourceAdapter.FillTextInput(channel.TextInput, textInputNavigator, manager, settings); } if (cloudNavigator != null) { channel.Cloud = new RssCloud(); Rss092SyndicationResourceAdapter.FillCloud(channel.Cloud, cloudNavigator, manager, settings); } }
/// <summary> /// Initializes the supplied <see cref="RssChannel"/> collection entities using the specified <see cref="XPathNavigator"/> and <see cref="XmlNamespaceManager"/>. /// </summary> /// <param name="channel">The <see cref="RssChannel"/> to be filled.</param> /// <param name="navigator">The <see cref="XPathNavigator"/> used to navigate the channel XML data.</param> /// <param name="manager">The <see cref="XmlNamespaceManager"/> used to resolve XML namespace prefixes.</param> /// <param name="settings">The <see cref="SyndicationResourceLoadSettings"/> object used to configure the load operation.</param> /// <exception cref="ArgumentNullException">The <paramref name="channel"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="navigator"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="manager"/> is a null reference (Nothing in Visual Basic).</exception> /// <exception cref="ArgumentNullException">The <paramref name="settings"/> is a null reference (Nothing in Visual Basic).</exception> private static void FillChannelCollections(RssChannel channel, XPathNavigator navigator, XmlNamespaceManager manager, SyndicationResourceLoadSettings settings) { Guard.ArgumentNotNull(channel, "channel"); Guard.ArgumentNotNull(navigator, "navigator"); Guard.ArgumentNotNull(manager, "manager"); Guard.ArgumentNotNull(settings, "settings"); XPathNodeIterator skipDaysIterator = navigator.Select("skipDays/day", manager); XPathNodeIterator skipHoursIterator = navigator.Select("skipHours/hour", manager); XPathNodeIterator itemIterator = navigator.Select("item", manager); if (skipDaysIterator != null && skipDaysIterator.Count > 0) { while (skipDaysIterator.MoveNext()) { if (!String.IsNullOrEmpty(skipDaysIterator.Current.Value)) { try { DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), skipDaysIterator.Current.Value, true); if (!channel.SkipDays.Contains(day)) { channel.SkipDays.Add(day); } } catch (ArgumentException) { System.Diagnostics.Trace.TraceWarning("Rss092SyndicationResourceAdapter unable to determine DayOfWeek with a name of {0}.", skipDaysIterator.Current.Value); } } } } if (skipHoursIterator != null && skipHoursIterator.Count > 0) { while (skipHoursIterator.MoveNext()) { int hour; if (Int32.TryParse(skipHoursIterator.Current.Value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out hour)) { hour = hour - 1; // Convert to zero-based range if (!channel.SkipHours.Contains(hour) && (hour >= 0 && hour <= 23)) { channel.SkipHours.Add(hour); } else { System.Diagnostics.Trace.TraceWarning("Rss092SyndicationResourceAdapter unable to add duplicate or out-of-range skip hour with a value of {0}.", hour); } } } } if (itemIterator != null && itemIterator.Count > 0) { int counter = 0; while (itemIterator.MoveNext()) { RssItem item = new RssItem(); counter++; if (settings.RetrievalLimit != 0 && counter > settings.RetrievalLimit) { break; } Rss092SyndicationResourceAdapter.FillItem(item, itemIterator.Current, manager, settings); ((Collection <RssItem>)channel.Items).Add(item); } } }