private void ParseAtom10Header(Atom10Feed atomFeed, string xml) { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); //Initialize our namespace manager. _nsManager = new XmlNamespaceManager(xmlDoc.NameTable); _nsManager.AddNamespace("atom", "http://www.w3.org/2005/Atom"); var titleNode = xmlDoc.DocumentElement.GetAttributeNode("/atom:feed/atom:title"); atomFeed.Title = titleNode.InnerText; var linkNode = xmlDoc.DocumentElement.GetAttributeNode("/atom:feed/atom:link[not(@rel)]/@href") ?? xmlDoc.DocumentElement.GetAttributeNode("/atom:feed/atom:author/atom:uri") ?? xmlDoc.DocumentElement.GetAttributeNode("/atom:feed/atom:link[@rel='alternate']/@href"); atomFeed.Link = linkNode == null ? string.Empty : linkNode.InnerText; var dateTimeNode = xmlDoc.DocumentElement.GetAttributeNode("/atom:feed/atom:updated"); DateTime timeOut; DateTime.TryParse(dateTimeNode.InnerText, out timeOut); atomFeed.LastUpdated = timeOut.ToUniversalTime(); var generatorNode = xmlDoc.DocumentElement.GetAttributeNode("/atom:feed/atom:generator"); atomFeed.Generator = generatorNode == null ? string.Empty : generatorNode.InnerText; }
private void ParseAtom10Header(Atom10Feed atomFeed, string xml) { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); //Initialize our namespace manager. NsManager = new XmlNamespaceManager(xmlDoc.NameTable); NsManager.AddNamespace("atom", "http://www.w3.org/2005/Atom"); var titleNode = xmlDoc.SelectSingleNode("/atom:feed/atom:title", NsManager); atomFeed.Title = titleNode.InnerText; var linkNode = xmlDoc.SelectSingleNode("/atom:feed/atom:link[not(@rel)]/@href", NsManager) ?? xmlDoc.SelectSingleNode("/atom:feed/atom:author/atom:uri", NsManager) ?? xmlDoc.SelectSingleNode("/atom:feed/atom:link[@rel='alternate']/@href", NsManager); atomFeed.Link = linkNode == null ? string.Empty : linkNode.InnerText; var dateTimeNode = xmlDoc.SelectSingleNode("/atom:feed/atom:updated", NsManager); DateTime timeOut; DateTime.TryParse(dateTimeNode.InnerText, out timeOut); atomFeed.LastUpdated = timeOut.ToUniversalTime(); var generatorNode = xmlDoc.SelectSingleNode("/atom:feed/atom:generator", NsManager); atomFeed.Generator = generatorNode == null ? string.Empty : generatorNode.InnerText; }
protected virtual void ParseAtom10Header(Atom10Feed atomFeed, string xml) { var document = XDocument.Parse(xml); var channel = document.Root; var titleNode = channel.Element(Atom10Namespace + "title"); atomFeed.Title = titleNode.Value; var linkNode = channel.Element(Atom10Namespace + "author") != null ? channel.Element(Atom10Namespace + "author").Element(Atom10Namespace + "uri") : null; if (linkNode == null) { linkNode = channel.Elements(Atom10Namespace + "link").SingleOrDefault(x => x.HasAttributes && x.Attribute("rel") == null) ?? channel.Elements(Atom10Namespace + "link").SingleOrDefault(x => x.HasAttributes && x.Attribute("rel") != null && x.Attribute("rel").Value == "alternate"); atomFeed.Link = linkNode == null ? string.Empty : linkNode.Attribute("href").Value; } else { atomFeed.Link = linkNode == null ? string.Empty : linkNode.Value; } var dateTimeNode = channel.Element(Atom10Namespace + "updated"); if (dateTimeNode != null) { DateTime timeOut; DateTime.TryParse(dateTimeNode.Value, out timeOut); atomFeed.LastUpdated = timeOut.ToUniversalTime(); } var generatorNode = channel.Element(Atom10Namespace + "generator"); atomFeed.Generator = generatorNode == null ? string.Empty : generatorNode.Value; }
protected virtual void ParseAtom10Header(Atom10Feed atomFeed, string xml) { var document = XDocument.Parse(xml); var channel = document.Root; var titleNode = channel.Element(Atom10Namespace + "title"); atomFeed.Title = titleNode.Value; var linkNode = channel.Element(Atom10Namespace + "author") != null?channel.Element(Atom10Namespace + "author").Element(Atom10Namespace + "uri") : null; if (linkNode == null) { linkNode = channel.Elements(Atom10Namespace + "link").SingleOrDefault(x => x.HasAttributes && x.Attribute("rel") == null) ?? channel.Elements(Atom10Namespace + "link").SingleOrDefault(x => x.HasAttributes && x.Attribute("rel") != null && x.Attribute("rel").Value == "alternate"); atomFeed.Link = linkNode == null ? string.Empty : linkNode.Attribute("href").Value; } else { atomFeed.Link = linkNode == null ? string.Empty : linkNode.Value; } var dateTimeNode = channel.Element(Atom10Namespace + "updated"); DateTime timeOut; DateTime.TryParse(dateTimeNode.Value, out timeOut); atomFeed.LastUpdated = timeOut.ToUniversalTime(); var generatorNode = channel.Element(Atom10Namespace + "generator"); atomFeed.Generator = generatorNode == null ? string.Empty : generatorNode.Value; }
private IFeed CreateFeed(FeedType feedtype, string feedxml) { try { IFeed returnFeed; if (feedtype == FeedType.Atom10) { returnFeed = new Atom10Feed(feedxml); } else { returnFeed = new Rss20Feed(feedxml); } try { this.parser.ParseFeed(returnFeed, feedxml); } catch (System.Xml.XmlException ex) { throw new InvalidFeedXmlException("The xml for feed is invalid", ex); } return(returnFeed); } catch (XmlException ex) { throw new InvalidFeedXmlException("Invalid XML for feed", ex); } }
public void FormatSampleFeedEmpty() { var feed = new Atom10Feed { Entries = new List <Atom10Entry> { new Atom10Entry() }, }; var tryFormatResult = Atom10FeedFormatter.TryFormatAtom10Feed(feed, out var document); Assert.True(tryFormatResult); var targetEncoding = Encoding.UTF8; var xmlWriterSettings = new XmlWriterSettings { Encoding = targetEncoding, Indent = true, }; using (var memoryStream = new MemoryStream()) using (var streamWriter = new StreamWriter(memoryStream, targetEncoding)) using (var xmlWriter = XmlWriter.Create(streamWriter, xmlWriterSettings)) { document.WriteTo(xmlWriter); xmlWriter.Flush(); var xmlString = targetEncoding.GetString(memoryStream.ToArray()); Assert.NotEmpty(xmlString); } }
private void ParseAtom10Items(Atom10Feed atomFeed, string xml) { var document = XDocument.Parse(xml); var feedItemNodes = document.Root.Elements(Atom10Namespace + "entry"); foreach (var item in feedItemNodes) { atomFeed.Items.Add(ParseAtom10SingleItem(item)); } }
public static bool TryFormatAtom10Feed(Atom10Feed feed, out XDocument document, ExtensionManifestDirectory extensionManifestDirectory = null) { document = default; if (feed == null) { return(false); } document = new XDocument(); var feedElement = new XElement(_atom + "feed"); document.Add(feedElement); var namespaceAliases = new XNamespaceAliasSet(); namespaceAliases.EnsureNamespaceAlias(alias: null, _atom); if (extensionManifestDirectory == null) { extensionManifestDirectory = ExtensionManifestDirectory.DefaultForAtom; } if (TryFormatAtom10OptionalTextAttribute(feed.Lang, _xml + "lang", out var langAttribute)) { feedElement.Add(langAttribute); } if (TryFormatAtom10OptionalTextAttribute(feed.Base, _xml + "base", out var baseAttribute)) { feedElement.Add(baseAttribute); } if (TryFormatAtom10RequiredTextElement(feed.Id, _atom + "id", out var idElement)) { feedElement.Add(idElement); } if (TryFormatAtom10TextRequired(feed.Title, _atom + "title", out var titleElement)) { feedElement.Add(titleElement); } if (TryFormatAtom10TimestampRequired(feed.Updated, _atom + "updated", out var updatedElement)) { feedElement.Add(updatedElement); } foreach (var authorToFormat in feed.Authors) { if (TryFormatAtom10Person(authorToFormat, _atom + "author", out var authorElement)) { feedElement.Add(authorElement); } } foreach (var linkToFormat in feed.Links) { if (TryFormatAtom10Link(linkToFormat, out var linkElement)) { feedElement.Add(linkElement); } } foreach (var categoryToFormat in feed.Categories) { if (TryFormatAtom10Category(categoryToFormat, out var categoryElement)) { feedElement.Add(categoryElement); } } foreach (var contributorToFormat in feed.Contributors) { if (TryFormatAtom10Person(contributorToFormat, _atom + "contributor", out var contributorElement)) { feedElement.Add(contributorElement); } } if (TryFormatAtom10Generator(feed.Generator, out var generatorElement)) { feedElement.Add(generatorElement); } if (TryFormatAtom10OptionalTextElement(feed.Icon, _atom + "icon", out var iconElement)) { feedElement.Add(iconElement); } if (TryFormatAtom10OptionalTextElement(feed.Logo, _atom + "logo", out var logoElement)) { feedElement.Add(logoElement); } if (TryFormatAtom10TextOptional(feed.Rights, _atom + "rights", out var rightsElement)) { feedElement.Add(rightsElement); } if (TryFormatAtom10TextOptional(feed.Subtitle, _atom + "subtitle", out var subtitleElement)) { feedElement.Add(subtitleElement); } // extensions if (ExtensibleEntityFormatter.TryFormatXElementExtensions(feed, namespaceAliases, extensionManifestDirectory, out var extensionElements)) { feedElement.AddRange(extensionElements); } // entries foreach (var entryToFormat in feed.Entries) { if (TryFormatAtom10Entry(entryToFormat, namespaceAliases, extensionManifestDirectory, out var entryElement)) { feedElement.Add(entryElement); } } foreach (var namespaceAlias in namespaceAliases.OrderBy(x => x.Name.LocalName)) { feedElement.Add(namespaceAlias); } return(true); }
public static bool TryParseAtom10Feed(XDocument document, out Atom10Feed parsedFeed, ExtensionManifestDirectory extensionManifestDirectory = null) { parsedFeed = default; XElement feedElement = null; XNamespace atom = null; foreach (var ns in Atom10Constants.RecognizedNamespaces) { atom = ns; feedElement = document?.Element(atom + "feed"); if (feedElement != null) { break; } } if (feedElement == null) { return(false); } if (extensionManifestDirectory == null) { extensionManifestDirectory = ExtensionManifestDirectory.DefaultForAtom; } parsedFeed = new Atom10Feed(); parsedFeed.Lang = feedElement.Attribute(_xml + "lang")?.Value; parsedFeed.Base = feedElement.Attribute(_xml + "base")?.Value; parsedFeed.Id = feedElement.Element(atom + "id")?.Value.Trim(); if (TryParseAtom10Text(feedElement.Element(atom + "title"), out var parsedTitle)) { parsedFeed.Title = parsedTitle; } if (TryParseAtom10Timestamp(feedElement.Element(atom + "updated"), out var parsedUpdated)) { parsedFeed.Updated = parsedUpdated; } foreach (var authorElement in feedElement.Elements(atom + "author")) { if (TryParseAtom10Person(authorElement, atom, out var parsedPerson)) { parsedFeed.Authors.Add(parsedPerson); } } foreach (var linkElement in feedElement.Elements(atom + "link")) { if (TryParseAtom10Link(linkElement, out var parsedLink)) { parsedFeed.Links.Add(parsedLink); } } foreach (var categoryElement in feedElement.Elements(atom + "category")) { if (TryParseAtom10Category(categoryElement, out var parsedCategory)) { parsedFeed.Categories.Add(parsedCategory); } } foreach (var contributorElement in feedElement.Elements(atom + "contributor")) { if (TryParseAtom10Person(contributorElement, atom, out var parsedPerson)) { parsedFeed.Contributors.Add(parsedPerson); } } if (TryParseAtom10Generator(feedElement.Element(atom + "generator"), out var parsedGenerator)) { parsedFeed.Generator = parsedGenerator; } parsedFeed.Icon = feedElement.Element(atom + "icon")?.Value.Trim(); parsedFeed.Logo = feedElement.Element(atom + "logo")?.Value.Trim(); if (TryParseAtom10Text(feedElement.Element(atom + "rights"), out var parsedRights)) { parsedFeed.Rights = parsedRights; } if (TryParseAtom10Text(feedElement.Element(atom + "subtitle"), out var parsedSubtitle)) { parsedFeed.Subtitle = parsedSubtitle; } // entries foreach (var entryElement in feedElement.Elements(atom + "entry")) { if (TryParseAtom10Entry(entryElement, atom, extensionManifestDirectory, out var parsedEntry)) { parsedFeed.Entries.Add(parsedEntry); } } // extensions ExtensibleEntityParser.ParseXElementExtensions(feedElement, extensionManifestDirectory, parsedFeed); return(true); }
public void FormatSampleFeed() { var feed = new Atom10Feed { Generator = new Atom10Generator { Value = "My Awesome Generator 3000", Version = "3000", Uri = "https://example.org/generator", }, Title = new Atom10Text { Value = "This is my <strong>feed</strong> title", Type = "html" }, Categories = new List <Atom10Category> { new Atom10Category { Term = "alpha", Label = "Alpha", Scheme = "https://example.org/categories" }, new Atom10Category { Term = "beta", Label = "Beta", Scheme = "https://example.org/categories" }, new Atom10Category { Term = "gamma", Label = "Gamma", Scheme = "https://example.org/categories" }, }, Id = "https://example.org/feed", Updated = new DateTimeOffset(2019, 01, 01, 4, 30, 00, TimeSpan.FromHours(0)), Subtitle = new Atom10Text { Value = "This is my feed's subtitle" }, Rights = new Atom10Text { Value = "All rights reserved." }, Contributors = new List <Atom10Person> { new Atom10Person { Name = "John", Uri = "https://example.org/john", Email = "*****@*****.**", }, }, Authors = new List <Atom10Person> { new Atom10Person { Name = "Jane", Uri = "https://example.org/jane", Email = "*****@*****.**", }, new Atom10Person { Name = "John", Uri = "https://example.org/john", Email = "*****@*****.**", }, }, Lang = "en-US", Icon = "https://example.org/icon.png", Logo = "https://example.org/logo.png", Links = new List <Atom10Link> { new Atom10Link { Title = "My link", Href = "https://example.org/my-link", Type = "text/html", Length = 1000, Hreflang = "en-GB", Rel = "via", }, new Atom10Link { Href = "https://example.org/feed-alternate", }, new Atom10Link { Href = "https://example.org/feed", Rel = "self", }, }, Entries = new List <Atom10Entry> { new Atom10Entry { Title = new Atom10Text { Value = "My awesome article" }, Categories = new List <Atom10Category> { new Atom10Category { Term = "delta", Label = "Delta", Scheme = "https://example.org/categories" } }, Published = new DateTimeOffset(2019, 01, 01, 5, 30, 00, TimeSpan.FromHours(0)), Updated = new DateTimeOffset(2019, 01, 05, 5, 30, 00, TimeSpan.FromHours(-5)), Id = "https://example.org/article-permalink", Authors = new List <Atom10Person> { new Atom10Person { Name = "Tom", Uri = "https://example.org/tom", Email = "*****@*****.**", }, }, Contributors = new List <Atom10Person> { new Atom10Person { Name = "Sarah", Uri = "https://example.org/sarah", Email = "*****@*****.**", }, }, Content = new Atom10Content { Value = "My <strong>HTML</strong> content.", Type = "html", }, Summary = new Atom10Text { Value = "<div xmlns=\"http://www.w3.org/1999/xhtml\">My awesome article summary...</div>", Type = "xhtml" }, Rights = new Atom10Text { Value = "All rights reserved again." }, Links = new List <Atom10Link> { new Atom10Link { Href = "https://example.org/article-alternate?hl=cs", Hreflang = "cs-CZ", }, }, Source = new Atom10Source { Id = "https://example.org/source", Title = new Atom10Text { Value = "Example, Inc." }, Updated = new DateTimeOffset(2003, 12, 13, 18, 30, 2, TimeSpan.Zero), }, } }, }; var tryFormatResult = Atom10FeedFormatter.TryFormatAtom10Feed(feed, out var document); Assert.True(tryFormatResult); var targetEncoding = Encoding.UTF8; var xmlWriterSettings = new XmlWriterSettings { Encoding = targetEncoding, Indent = true, }; using (var memoryStream = new MemoryStream()) using (var streamWriter = new StreamWriter(memoryStream, targetEncoding)) using (var xmlWriter = XmlWriter.Create(streamWriter, xmlWriterSettings)) { document.WriteTo(xmlWriter); xmlWriter.Flush(); var xmlString = targetEncoding.GetString(memoryStream.ToArray()); Assert.NotEmpty(xmlString); } }