//============================================================ // ICOMPARABLE IMPLEMENTATION //============================================================ #region CompareTo(object obj) /// <summary> /// Compares the current instance with another object of the same type. /// </summary> /// <param name="obj">An object to compare with this instance.</param> /// <returns>A 32-bit signed integer that indicates the relative order of the objects being compared.</returns> /// <exception cref="ArgumentException">The <paramref name="obj"/> is not the expected <see cref="Type"/>.</exception> public int CompareTo(object obj) { //------------------------------------------------------------ // If target is a null reference, instance is greater //------------------------------------------------------------ if (obj == null) { return(1); } //------------------------------------------------------------ // Determine comparison result using property state of objects //------------------------------------------------------------ RssEnclosure value = obj as RssEnclosure; if (value != null) { int result = String.Compare(this.ContentType, value.ContentType, StringComparison.OrdinalIgnoreCase); result = result | this.Length.CompareTo(value.Length); result = result | Uri.Compare(this.Url, value.Url, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase); return(result); } else { throw new ArgumentException(String.Format(null, "obj is not of type {0}, type was found to be '{1}'.", this.GetType().FullName, obj.GetType().FullName), "obj"); } }
/// <summary> /// Compares the current instance with another object of the same type. /// </summary> /// <param name="obj">An object to compare with this instance.</param> /// <returns>A 32-bit signed integer that indicates the relative order of the objects being compared.</returns> /// <exception cref="ArgumentException">The <paramref name="obj"/> is not the expected <see cref="Type"/>.</exception> public int CompareTo(object obj) { if (obj == null) { return(1); } RssEnclosure value = obj as RssEnclosure; if (value != null) { int result = String.Compare(this.ContentType, value.ContentType, StringComparison.OrdinalIgnoreCase); result = result | this.Length.CompareTo(value.Length); result = result | Uri.Compare(this.Url, value.Url, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase); return(result); } else { throw new ArgumentException(String.Format(null, "obj is not of type {0}, type was found to be '{1}'.", this.GetType().FullName, obj.GetType().FullName), "obj"); } }
private void RenderRss() { Argotic.Syndication.RssFeed feed = new Argotic.Syndication.RssFeed(); RssChannel channel = new RssChannel(); channel.Generator = "mojoPortal Blog Module"; channel.Language = SiteUtils.GetDefaultCulture(); feed.Channel = channel; if (module.ModuleTitle.Length > 0) { channel.Title = module.ModuleTitle; } else { channel.Title = "Blog"; // it will cause an error if this is left blank so we must populate it if the module title is an emty string. } // this became broken when we combined query string params, since pageid is not one of the params this always returns the home page url // instead of the blog page url //string pu = WebUtils.ResolveServerUrl(SiteUtils.GetCurrentPageUrl()); string pu = WebUtils.ResolveServerUrl(SiteUtils.GetPageUrl(pageSettings)); channel.Link = new System.Uri(pu); channel.SelfLink = Request.Url; if (config.ChannelDescription.Length > 0) { channel.Description = config.ChannelDescription; } if (config.Copyright.Length > 0) { channel.Copyright = config.Copyright; } channel.ManagingEditor = config.ManagingEditorEmail; if (config.ManagingEditorName.Length > 0) { channel.ManagingEditor += " (" + config.ManagingEditorName + ")"; } if (config.FeedTimeToLive > -1) { channel.TimeToLive = config.FeedTimeToLive; } // Create and add iTunes information to feed channel ITunesSyndicationExtension channelExtension = new ITunesSyndicationExtension(); channelExtension.Context.Subtitle = config.ChannelDescription; if (config.HasExplicitContent) { channelExtension.Context.ExplicitMaterial = ITunesExplicitMaterial.Yes; } else { channelExtension.Context.ExplicitMaterial = ITunesExplicitMaterial.No; } channelExtension.Context.Author = config.ManagingEditorEmail; if (config.ManagingEditorName.Length > 0) { channelExtension.Context.Author += " (" + config.ManagingEditorName + ")"; } channelExtension.Context.Summary = config.ChannelDescription; channelExtension.Context.Owner = new ITunesOwner(config.ManagingEditorEmail, config.ManagingEditorName); if (config.FeedLogoUrl.Length > 0) { try { channelExtension.Context.Image = new Uri(config.FeedLogoUrl); } catch (ArgumentNullException) { } catch (UriFormatException) { } } if (config.FeedMainCategory.Length > 0) { ITunesCategory mainCat = new ITunesCategory(config.FeedMainCategory); if (config.FeedSubCategory.Length > 0) { mainCat.Categories.Add(new ITunesCategory(config.FeedSubCategory)); } channelExtension.Context.Categories.Add(mainCat); } feed.Channel.AddExtension(channelExtension); DataSet dsBlogPosts = GetData(); DataTable posts = dsBlogPosts.Tables["Posts"]; foreach (DataRow dr in posts.Rows) { bool inFeed = Convert.ToBoolean(dr["IncludeInFeed"]); if (!inFeed) { continue; } RssItem item = new RssItem(); int itemId = Convert.ToInt32(dr["ItemID"]); string blogItemUrl = FormatBlogUrl(dr["ItemUrl"].ToString(), itemId); item.Link = new Uri(Request.Url, blogItemUrl); item.Guid = new RssGuid(blogItemUrl); item.Title = dr["Heading"].ToString(); item.PublicationDate = Convert.ToDateTime(dr["StartDate"]); bool showAuthor = Convert.ToBoolean(dr["ShowAuthorName"]); if (showAuthor) { // techically this is supposed to be an email address // but wouldn't that lead to a lot of spam? string authorEmail = dr["Email"].ToString(); string authorName = dr["Name"].ToString(); if (BlogConfiguration.IncludeAuthorEmailInFeed) { item.Author = authorEmail + " (" + authorName + ")"; } else { item.Author = authorName; } } else if (config.ManagingEditorEmail.Length > 0) { item.Author = config.ManagingEditorEmail; } item.Comments = new Uri(blogItemUrl); string signature = string.Empty; if (config.AddSignature) { signature = "<br /><a href='" + blogItemUrl + "'>" + dr["Name"].ToString() + "</a>"; } if ((config.AddCommentsLinkToFeed) && (config.AllowComments)) { signature += " " + "<a href='" + blogItemUrl + "'>...</a>"; } if (config.AddTweetThisToFeed) { signature += GenerateTweetThisLink(item.Title, blogItemUrl); } if (config.AddFacebookLikeToFeed) { signature += GenerateFacebookLikeButton(blogItemUrl); } string blogPost = SiteUtils.ChangeRelativeUrlsToFullyQualifiedUrls(navigationSiteRoot, imageSiteRoot, dr["Description"].ToString().RemoveCDataTags()); string staticMapLink = BuildStaticMapMarkup(dr); if (staticMapLink.Length > 0) { // add a google static map blogPost += staticMapLink; } if ((!config.UseExcerptInFeed) || (blogPost.Length <= config.ExcerptLength)) { item.Description = blogPost + signature; } else { string excerpt = SiteUtils.ChangeRelativeUrlsToFullyQualifiedUrls(navigationSiteRoot, imageSiteRoot, dr["Abstract"].ToString().RemoveCDataTags()); if ((excerpt.Length > 0) && (excerpt != "<p> </p>")) { excerpt = excerpt + config.ExcerptSuffix + " <a href='" + blogItemUrl + "'>" + config.MoreLinkText + "</a><div class='excerptspacer'> </div>"; } else { excerpt = UIHelper.CreateExcerpt(dr["Description"].ToString(), config.ExcerptLength, config.ExcerptSuffix) + " <a href='" + blogItemUrl + "'>" + config.MoreLinkText + "</a><div class='excerptspacer'> </div>"; ; } item.Description = excerpt; } // how to add media enclosures for podcasting //http://www.podcast411.com/howto_1.html //http://argotic.codeplex.com/wikipage?title=Generating%20an%20extended%20RSS%20feed //http://techwhimsy.com/stream-mp3s-with-google-mp3-player //Uri url = new Uri("http://media.libsyn.com/media/podcast411/411_060325.mp3"); //string type = "audio/mpeg"; //long length = 11779397; string blogGuid = dr["BlogGuid"].ToString(); string whereClause = string.Format("ItemGuid = '{0}'", blogGuid); if (!config.UseExcerptInFeed) { DataView dv = new DataView(dsBlogPosts.Tables["Attachments"], whereClause, "", DataViewRowState.CurrentRows); foreach (DataRowView rowView in dv) { DataRow row = rowView.Row; Uri mediaUrl = new Uri(WebUtils.ResolveServerUrl(attachmentBaseUrl + row["ServerFileName"].ToString())); long contentLength = Convert.ToInt64(row["ContentLength"]); string contentType = row["ContentType"].ToString(); RssEnclosure enclosure = new RssEnclosure(contentLength, contentType, mediaUrl); item.Enclosures.Add(enclosure); //http://argotic.codeplex.com/wikipage?title=Generating%20an%20extended%20RSS%20feed ITunesSyndicationExtension itemExtension = new ITunesSyndicationExtension(); itemExtension.Context.Author = dr["Name"].ToString(); itemExtension.Context.Subtitle = dr["SubTitle"].ToString(); //itemExtension.Context.Summary = "The iTunes syndication extension properties that are used vary based on whether extending the channel or an item"; //itemExtension.Context.Duration = new TimeSpan(1, 2, 13); //itemExtension.Context.Keywords.Add("Podcast"); //itemExtension.Context.Keywords.Add("iTunes"); whereClause = string.Format("ItemID = '{0}'", itemId); DataView dvCat = new DataView(dsBlogPosts.Tables["Categories"], whereClause, "", DataViewRowState.CurrentRows); foreach (DataRowView rView in dvCat) { DataRow r = rView.Row; item.Categories.Add(new RssCategory(r["Category"].ToString())); itemExtension.Context.Keywords.Add(r["Category"].ToString()); } item.AddExtension(itemExtension); } } channel.AddItem(item); } if ((config.FeedburnerFeedUrl.Length > 0) || (Request.Url.AbsolutePath.Contains("localhost"))) { Response.Cache.SetExpires(DateTime.Now.AddMinutes(-30)); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.VaryByParams["r"] = true; } else { Response.Cache.SetExpires(DateTime.Now.AddMinutes(30)); Response.Cache.SetCacheability(HttpCacheability.Public); } Response.ContentType = "application/xml"; Encoding encoding = new UTF8Encoding(); Response.ContentEncoding = encoding; using (XmlTextWriter xmlTextWriter = new XmlTextWriter(Response.OutputStream, encoding)) { xmlTextWriter.Formatting = Formatting.Indented; ////////////////// // style for RSS Feed viewed in browsers if (ConfigurationManager.AppSettings["RSSCSS"] != null) { string rssCss = ConfigurationManager.AppSettings["RSSCSS"].ToString(); xmlTextWriter.WriteWhitespace(" "); xmlTextWriter.WriteRaw("<?xml-stylesheet type=\"text/css\" href=\"" + cssBaseUrl + rssCss + "\" ?>"); } if (ConfigurationManager.AppSettings["RSSXsl"] != null) { string rssXsl = ConfigurationManager.AppSettings["RSSXsl"].ToString(); xmlTextWriter.WriteWhitespace(" "); xmlTextWriter.WriteRaw("<?xml-stylesheet type=\"text/xsl\" href=\"" + cssBaseUrl + rssXsl + "\" ?>"); } /////////////////////////// feed.Save(xmlTextWriter); } }
/// <summary> /// Loads this <see cref="RssItem"/> using the supplied <see cref="XPathNavigator"/> and <see cref="SyndicationResourceLoadSettings"/>. /// </summary> /// <param name="source">The <see cref="XPathNavigator"/> to extract information from.</param> /// <param name="settings">The <see cref="SyndicationResourceLoadSettings"/> used to configure the load operation.</param> /// <returns><b>true</b> if the <see cref="RssItem"/> was initialized using the supplied <paramref name="source"/>, otherwise <b>false</b>.</returns> /// <remarks> /// This method expects the supplied <paramref name="source"/> to be positioned on the XML element that represents a <see cref="RssItem"/>. /// </remarks> /// <exception cref="ArgumentNullException">The <paramref name="source"/> 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> public bool Load(XPathNavigator source, SyndicationResourceLoadSettings settings) { //------------------------------------------------------------ // Local members //------------------------------------------------------------ bool wasLoaded = false; //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNull(source, "source"); Guard.ArgumentNotNull(settings, "settings"); //------------------------------------------------------------ // Create namespace resolver //------------------------------------------------------------ XmlNamespaceManager manager = new XmlNamespaceManager(source.NameTable); //------------------------------------------------------------ // Attempt to extract syndication information //------------------------------------------------------------ XPathNavigator authorNavigator = source.SelectSingleNode("author", manager); XPathNavigator commentsNavigator = source.SelectSingleNode("comments", manager); XPathNavigator descriptionNavigator = source.SelectSingleNode("description", manager); XPathNavigator guidNavigator = source.SelectSingleNode("guid", manager); XPathNavigator linkNavigator = source.SelectSingleNode("link", manager); XPathNavigator publicationNavigator = source.SelectSingleNode("pubDate", manager); XPathNavigator sourceNavigator = source.SelectSingleNode("source", manager); XPathNavigator titleNavigator = source.SelectSingleNode("title", manager); XPathNodeIterator categoryIterator = source.Select("category", manager); XPathNodeIterator enclosureIterator = source.Select("enclosure", manager); //------------------------------------------------------------ // Load required/common item elements //------------------------------------------------------------ if (titleNavigator != null) { this.Title = titleNavigator.Value; wasLoaded = true; } if (descriptionNavigator != null) { this.Description = descriptionNavigator.Value; wasLoaded = true; } if (linkNavigator != null) { Uri link; if (Uri.TryCreate(linkNavigator.Value, UriKind.RelativeOrAbsolute, out link)) { this.Link = link; wasLoaded = true; } } //------------------------------------------------------------ // Load optional item elements //------------------------------------------------------------ if (authorNavigator != null) { this.Author = authorNavigator.Value; wasLoaded = true; } if (commentsNavigator != null) { Uri comments; if (Uri.TryCreate(commentsNavigator.Value, UriKind.RelativeOrAbsolute, out comments)) { this.Comments = comments; wasLoaded = true; } } if (guidNavigator != null) { RssGuid guid = new RssGuid(); if (guid.Load(guidNavigator, settings)) { this.Guid = guid; wasLoaded = true; } } if (publicationNavigator != null) { DateTime publicationDate; if (SyndicationDateTimeUtility.TryParseRfc822DateTime(publicationNavigator.Value, out publicationDate)) { this.PublicationDate = publicationDate; wasLoaded = true; } } if (sourceNavigator != null) { RssSource sourceFeed = new RssSource(); if (sourceFeed.Load(sourceNavigator, settings)) { this.Source = sourceFeed; wasLoaded = true; } } //------------------------------------------------------------ // Load item collection elements //------------------------------------------------------------ if (categoryIterator != null && categoryIterator.Count > 0) { while (categoryIterator.MoveNext()) { RssCategory category = new RssCategory(); if (category.Load(categoryIterator.Current, settings)) { this.Categories.Add(category); } } } if (enclosureIterator != null && enclosureIterator.Count > 0) { while (enclosureIterator.MoveNext()) { RssEnclosure enclosure = new RssEnclosure(); if (enclosure.Load(enclosureIterator.Current, settings)) { this.Enclosures.Add(enclosure); } } } //------------------------------------------------------------ // Attempt to extract syndication extension information //------------------------------------------------------------ SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(source, settings); adapter.Fill(this); return(wasLoaded); }
/// <summary> /// Loads this <see cref="RssItem"/> using the supplied <see cref="XPathNavigator"/>. /// </summary> /// <param name="source">The <see cref="XPathNavigator"/> to extract information from.</param> /// <returns><b>true</b> if the <see cref="RssItem"/> was initialized using the supplied <paramref name="source"/>, otherwise <b>false</b>.</returns> /// <remarks> /// This method expects the supplied <paramref name="source"/> to be positioned on the XML element that represents a <see cref="RssItem"/>. /// </remarks> /// <exception cref="ArgumentNullException">The <paramref name="source"/> is a null reference (Nothing in Visual Basic).</exception> public bool Load(XPathNavigator source) { bool wasLoaded = false; Guard.ArgumentNotNull(source, "source"); XmlNamespaceManager manager = new XmlNamespaceManager(source.NameTable); XPathNavigator authorNavigator = source.SelectSingleNode("author", manager); XPathNavigator commentsNavigator = source.SelectSingleNode("comments", manager); XPathNavigator descriptionNavigator = source.SelectSingleNode("description", manager); XPathNavigator guidNavigator = source.SelectSingleNode("guid", manager); XPathNavigator linkNavigator = source.SelectSingleNode("link", manager); XPathNavigator publicationNavigator = source.SelectSingleNode("pubDate", manager); XPathNavigator sourceNavigator = source.SelectSingleNode("source", manager); XPathNavigator titleNavigator = source.SelectSingleNode("title", manager); XPathNodeIterator categoryIterator = source.Select("category", manager); XPathNodeIterator enclosureIterator = source.Select("enclosure", manager); if (titleNavigator != null) { this.Title = titleNavigator.Value; wasLoaded = true; } if (descriptionNavigator != null) { this.Description = descriptionNavigator.Value; wasLoaded = true; } if (linkNavigator != null) { Uri link; if (Uri.TryCreate(linkNavigator.Value, UriKind.RelativeOrAbsolute, out link)) { this.Link = link; wasLoaded = true; } } if (authorNavigator != null) { this.Author = authorNavigator.Value; wasLoaded = true; } if (commentsNavigator != null) { Uri comments; if (Uri.TryCreate(commentsNavigator.Value, UriKind.RelativeOrAbsolute, out comments)) { this.Comments = comments; wasLoaded = true; } } if (guidNavigator != null) { RssGuid guid = new RssGuid(); if (guid.Load(guidNavigator)) { this.Guid = guid; wasLoaded = true; } } if (publicationNavigator != null) { DateTime publicationDate; if (SyndicationDateTimeUtility.TryParseRfc822DateTime(publicationNavigator.Value, out publicationDate)) { this.PublicationDate = publicationDate; wasLoaded = true; } } if (sourceNavigator != null) { RssSource sourceFeed = new RssSource(); if (sourceFeed.Load(sourceNavigator)) { this.Source = sourceFeed; wasLoaded = true; } } if (categoryIterator != null && categoryIterator.Count > 0) { while (categoryIterator.MoveNext()) { RssCategory category = new RssCategory(); if (category.Load(categoryIterator.Current)) { this.Categories.Add(category); } } } if (enclosureIterator != null && enclosureIterator.Count > 0) { while (enclosureIterator.MoveNext()) { RssEnclosure enclosure = new RssEnclosure(); if (enclosure.Load(enclosureIterator.Current)) { this.Enclosures.Add(enclosure); } } } return(wasLoaded); }
/// <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) { //------------------------------------------------------------ // Validate parameters //------------------------------------------------------------ Guard.ArgumentNotNull(item, "item"); Guard.ArgumentNotNull(navigator, "navigator"); Guard.ArgumentNotNull(manager, "manager"); Guard.ArgumentNotNull(settings, "settings"); //------------------------------------------------------------ // Attempt to extract item information //------------------------------------------------------------ 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="RssEnclosure"/> using the specified <see cref="XPathNavigator"/> and <see cref="XmlNamespaceManager"/>. /// </summary> /// <param name="enclosure">The <see cref="RssEnclosure"/> to be filled.</param> /// <param name="navigator">The <see cref="XPathNavigator"/> used to navigate the enclosure 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="enclosure"/> 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 FillEnclosure(RssEnclosure enclosure, XPathNavigator navigator, XmlNamespaceManager manager, SyndicationResourceLoadSettings settings) { //------------------------------------------------------------ // Validate parameters //------------------------------------------------------------ Guard.ArgumentNotNull(enclosure, "enclosure"); Guard.ArgumentNotNull(navigator, "navigator"); Guard.ArgumentNotNull(manager, "manager"); Guard.ArgumentNotNull(settings, "settings"); //------------------------------------------------------------ // Attempt to extract enclosure information //------------------------------------------------------------ if (navigator.HasAttributes) { string urlAttribute = navigator.GetAttribute("url", String.Empty); string lengthAttribute = navigator.GetAttribute("length", String.Empty); string typeAttribute = navigator.GetAttribute("type", String.Empty); Uri url; if (Uri.TryCreate(urlAttribute, UriKind.RelativeOrAbsolute, out url)) { enclosure.Url = url; } long length; if (Int64.TryParse(lengthAttribute, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out length)) { enclosure.Length = length; } if (!String.IsNullOrEmpty(typeAttribute)) { enclosure.ContentType = typeAttribute; } } SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(navigator, settings); adapter.Fill(enclosure); }
/// <summary> /// Loads this <see cref="RssItem"/> using the supplied <see cref="XPathNavigator"/> and <see cref="SyndicationResourceLoadSettings"/>. /// </summary> /// <param name="source">The <see cref="XPathNavigator"/> to extract information from.</param> /// <param name="settings">The <see cref="SyndicationResourceLoadSettings"/> used to configure the load operation.</param> /// <returns><b>true</b> if the <see cref="RssItem"/> was initialized using the supplied <paramref name="source"/>, otherwise <b>false</b>.</returns> /// <remarks> /// This method expects the supplied <paramref name="source"/> to be positioned on the XML element that represents a <see cref="RssItem"/>. /// </remarks> /// <exception cref="ArgumentNullException">The <paramref name="source"/> 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> public bool Load(XPathNavigator source, SyndicationResourceLoadSettings settings) { //------------------------------------------------------------ // Local members //------------------------------------------------------------ bool wasLoaded = false; //------------------------------------------------------------ // Validate parameter //------------------------------------------------------------ Guard.ArgumentNotNull(source, "source"); Guard.ArgumentNotNull(settings, "settings"); //------------------------------------------------------------ // Create namespace resolver //------------------------------------------------------------ XmlNamespaceManager manager = new XmlNamespaceManager(source.NameTable); //------------------------------------------------------------ // Attempt to extract syndication information //------------------------------------------------------------ XPathNavigator authorNavigator = source.SelectSingleNode("author", manager); XPathNavigator commentsNavigator = source.SelectSingleNode("comments", manager); XPathNavigator descriptionNavigator = source.SelectSingleNode("description", manager); XPathNavigator guidNavigator = source.SelectSingleNode("guid", manager); XPathNavigator linkNavigator = source.SelectSingleNode("link", manager); XPathNavigator publicationNavigator = source.SelectSingleNode("pubDate", manager); XPathNavigator sourceNavigator = source.SelectSingleNode("source", manager); XPathNavigator titleNavigator = source.SelectSingleNode("title", manager); XPathNodeIterator categoryIterator = source.Select("category", manager); XPathNodeIterator enclosureIterator = source.Select("enclosure", manager); //------------------------------------------------------------ // Load required/common item elements //------------------------------------------------------------ if (titleNavigator != null) { this.Title = titleNavigator.Value; wasLoaded = true; } if (descriptionNavigator != null) { this.Description = descriptionNavigator.Value; wasLoaded = true; } if (linkNavigator != null) { Uri link; if (Uri.TryCreate(linkNavigator.Value, UriKind.RelativeOrAbsolute, out link)) { this.Link = link; wasLoaded = true; } } //------------------------------------------------------------ // Load optional item elements //------------------------------------------------------------ if (authorNavigator != null) { this.Author = authorNavigator.Value; wasLoaded = true; } if (commentsNavigator != null) { Uri comments; if (Uri.TryCreate(commentsNavigator.Value, UriKind.RelativeOrAbsolute, out comments)) { this.Comments = comments; wasLoaded = true; } } if (guidNavigator != null) { RssGuid guid = new RssGuid(); if (guid.Load(guidNavigator, settings)) { this.Guid = guid; wasLoaded = true; } } if (publicationNavigator != null) { DateTime publicationDate; if (SyndicationDateTimeUtility.TryParseRfc822DateTime(publicationNavigator.Value, out publicationDate)) { this.PublicationDate = publicationDate; wasLoaded = true; } } if (sourceNavigator != null) { RssSource sourceFeed = new RssSource(); if (sourceFeed.Load(sourceNavigator, settings)) { this.Source = sourceFeed; wasLoaded = true; } } //------------------------------------------------------------ // Load item collection elements //------------------------------------------------------------ if (categoryIterator != null && categoryIterator.Count > 0) { while (categoryIterator.MoveNext()) { RssCategory category = new RssCategory(); if (category.Load(categoryIterator.Current, settings)) { this.Categories.Add(category); } } } if (enclosureIterator != null && enclosureIterator.Count > 0) { while (enclosureIterator.MoveNext()) { RssEnclosure enclosure = new RssEnclosure(); if (enclosure.Load(enclosureIterator.Current, settings)) { this.Enclosures.Add(enclosure); } } } //------------------------------------------------------------ // Attempt to extract syndication extension information //------------------------------------------------------------ SyndicationExtensionAdapter adapter = new SyndicationExtensionAdapter(source, settings); adapter.Fill(this); return wasLoaded; }