Skip to content
kearns2000Public

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

SimpleRSS

NuGet NuGet Downloads CI License .NET

A lightweight .NET RSS feed reader, parser, and aggregator for RSS 2.0, Atom 1.0, and RDF syndication feeds.

Version 2.x is a modern rewrite for .NET 8+ with async HTTP support, feed metadata, typed dates, caching, feed discovery, parallel multi-feed fetching, and dependency injection.

Keywords: RSS reader, RSS parser, Atom reader, Atom parser, syndication feed, feed aggregator, XML feed parser, HTTP feed fetcher, podcast RSS, feed discovery, .NET 8, dependency injection.

Install

dotnet add package SimpleRSS

Quick start

using SimpleRSS;

using var reader = new FeedReader();

var feed = await reader.GetFeedAsync("https://example.com/feed.rss");
Console.WriteLine(feed.Title);

foreach (var item in feed.Items)
{
    Console.WriteLine($"{item.Published:g}\t{item.Title}");
    Console.WriteLine(item.Link);
}

Note: Feed Summary and Content fields may contain HTML. Sanitize before rendering in a UI.

Dependency injection

builder.Services.AddSimpleRss(options => options with { MaxConcurrentRequests = 8 });

public class FeedService(FeedReader reader)
{
    public Task<Feed> LoadAsync(string url) => reader.GetFeedAsync(url);
}

Response caching is opt-in when using dependency injection:

builder.Services.AddSimpleRss(options => options with { EnableResponseCache = true });

Parse local XML

var feed = FeedReader.Parse(File.ReadAllText("feed.xml"));

await using var stream = File.OpenRead("feed.xml");
var feedFromStream = await FeedReader.ParseAsync(stream);

Read multiple feeds

GetFeedsAsync returns per-feed results and supports partial success:

using var reader = new FeedReader();

var results = await reader.GetFeedsAsync([
    "https://example.com/feed-a.rss",
    "https://example.com/feed-b.rss"
]);

foreach (var result in results.Where(result => result.IsSuccess))
{
    Console.WriteLine(result.Feed!.Title);
}

Combine items across feeds:

using var reader = new FeedReader(new FeedReaderOptions
{
    InterleaveMultipleFeeds = true
});

var items = await reader.GetCombinedItemsAsync([
    "https://example.com/feed-a.rss",
    "https://example.com/feed-b.rss"
]);

Discover feeds from a website

using var discovery = new FeedDiscovery(new HttpClient());
var feedUrl = await discovery.DiscoverFeedUrlAsync("https://example.com/blog");

using var reader = new FeedReader();
var feed = await reader.DiscoverAndGetFeedAsync("https://example.com/blog");

Conditional HTTP caching

var cache = new InMemoryFeedResponseCache();
using var reader = new FeedReader(new FeedReaderOptions
{
    ResponseCache = cache
});

var feed = await reader.GetFeedAsync("https://example.com/feed.rss");

Supported formats

  • RSS 2.0
  • Atom 1.0
  • RSS 1.0 / RDF

License

Apache-2.0 — see LICENSE.

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages