コード例 #1
0
        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;
        }
コード例 #2
0
        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;
        }
コード例 #3
0
ファイル: LinqFeedXmlParser.cs プロジェクト: GuiBGP/qdfeed
        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;

        }
コード例 #4
0
        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;
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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);
                    }
        }
コード例 #7
0
ファイル: LinqFeedXmlParser.cs プロジェクト: GuiBGP/qdfeed
 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));
     }
 }
コード例 #8
0
        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));
            }
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
                    }
        }