Il modo migliore per leggere feed RSS in .net utilizzando C #


106

Qual è il modo migliore per leggere i feed RSS ?

Sto usando XmlTextReaderper raggiungere questo obiettivo. C'è un altro modo migliore per farlo?

XmlTextReader reader = new XmlTextReader(strURL);

DataSet ds = new DataSet();
ds.ReadXml(reader);

Dopo aver letto il feed RSS utilizzando XmlTextReader, c'è un modo per popolare i dati ListIteminvece di DataSet?

inserisci qui la descrizione dell'immagine

Risposte:


176

Aggiungi System.ServiceModelriferimenti

Utilizzando SyndicationFeed:

string url = "http://fooblog.com/feed";
XmlReader reader = XmlReader.Create(url);
SyndicationFeed feed = SyndicationFeed.Load(reader);
reader.Close();
foreach (SyndicationItem item in feed.Items)
{
    String subject = item.Title.Text;    
    String summary = item.Summary.Text;
    ...                
}

13
Questo è lo schizzle. Fantastico e succinto. È inoltre necessario utilizzare System.Xml; ma è abbastanza evidente. Per Blogger l'URL è attualmente " blogname.blogspot.com/feeds/posts/default " (Atom 1.0) e " blogname.blogspot.com/feeds/posts/default?alt=rss " per RSS 2.0. L'elemento SyndicationItem ha tutte le proprietà dell'elemento di cui avrai bisogno. Basta esaminare l'oggetto nel debugger di Visual Studio ed essere illuminato.
secretwep

possiamo usare XmlTextReader invece di xmlreader qualsiasi differenza di prestazioni?
Dragon

1
Breve e dolce. Grazie!
Bogdan Doicin

8
Per .Net Core, il pacchetto NuGet che vuoi installare per usarlo èSystem.ServiceModel.Syndication
adam0101

per il 2019 questo esplode ogni volta che provo ad accedere all'unica versione che è il prerelease.
Clarence

11

Questo è un vecchio post, ma per risparmiare tempo alle persone se arrivi qui ora come ho fatto io, ti suggerisco di dare un'occhiata al pacchetto CodeHollow.FeedReader che supporta una gamma più ampia di versioni RSS, è più facile da usare e sembra più robusto . https://github.com/codehollow/FeedReader



3

Usa questo :

private string GetAlbumRSS(SyndicationItem album)
    {

        string url = "";
        foreach (SyndicationElementExtension ext in album.ElementExtensions)
            if (ext.OuterName == "itemRSS") url = ext.GetObject<string>();
        return (url);

    }
    protected void Page_Load(object sender, EventArgs e)
    {
        string albumRSS;
        string url = "http://www.SomeSite.com/rss‎";
        XmlReader r = XmlReader.Create(url);
        SyndicationFeed albums = SyndicationFeed.Load(r);
        r.Close();
        foreach (SyndicationItem album in albums.Items)
        {

            cell.InnerHtml = cell.InnerHtml +string.Format("<br \'><a href='{0}'>{1}</a>", album.Links[0].Uri, album.Title.Text);
            albumRSS = GetAlbumRSS(album);

        }



    }

0

Aggiornamento: questo supporta solo con UWP - Windows Community Toolkit

Adesso c'è un modo molto più semplice. Puoi usare la classe RssParser . Il codice di esempio è fornito di seguito.

public async void ParseRSS()
{
    string feed = null;

    using (var client = new HttpClient())
    {
        try
        {
            feed = await client.GetStringAsync("https://visualstudiomagazine.com/rss-feeds/news.aspx");
        }
        catch { }
    }

    if (feed != null)
    {
        var parser = new RssParser();
        var rss = parser.Parse(feed);

        foreach (var element in rss)
        {
            Console.WriteLine($"Title: {element.Title}");
            Console.WriteLine($"Summary: {element.Summary}");
        }
    }
}

Per i non UWP, usa il Syndication dallo spazio dei nomi System.ServiceModel.Syndicationcome altri hanno suggerito.

public static IEnumerable <FeedItem> GetLatestFivePosts() {
    var reader = XmlReader.Create("https://sibeeshpassion.com/feed/");
    var feed = SyndicationFeed.Load(reader);
    reader.Close();
    return (from itm in feed.Items select new FeedItem {
        Title = itm.Title.Text, Link = itm.Id
    }).ToList().Take(5);
}

public class FeedItem {
    public string Title {
        get;
        set;
    }
    public string Link {
        get;
        set;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.