2012-06-25 5 views
4

Comment puis-je consommer le flux RSS de mon blog WordPress pour afficher mes derniers billets de blog sur ma page d'accueil? Je courais dans la pièce suivante de code pour ce faire:Consommation de flux RSS WordPress dans ASP.NET

Function GetRSSFeed(strURL as String) as DataTable 
    'Get the XML data 
    Dim reader as XmlTextReader = New XmlTextReader(strURL) 

    'return a new DataSet 
    Dim ds as DataSet = New DataSet() 
    ds.ReadXml(reader)  
    Return ds.Tables(2) 
    End Function 

Mais les erreurs dues à cette ligne: « ds.ReadXml (lecteur) » avec l'erreur suivante:

A column named 'comments' already belongs to this DataTable. 

Peut-être doesn pas travailler puisque ce code date de 2003? Quelqu'un at-il un échantillon de code de travail? Merci d'avance!

Répondre

17

Vous pouvez utiliser LINQ to XML pour lire un flux RSS WordPress.

Obtenez d'abord le flux. Créez une instance d'Uri.

var rssFeed = new Uri("http://cgeers.com/feed/"); 

Effectuez ensuite une requête GET.

var request = (HttpWebRequest) WebRequest.Create(rssFeed); 
request.Method = "GET"; 
var response = (HttpWebResponse) request.GetResponse(); 

Obtenez le flux de réponses et lisez-le pour télécharger le contenu du flux. Toujours dans l'instruction ci-dessus, utilisez LINQ to XML pour analyser le contenu téléchargé et extraire les informations dont vous avez besoin.

var document = XDocument.Parse(feedContents); 

var posts = (from p in document.Descendants("item") 
      select new 
      { 
       Title = p.Element("title").Value, 
       Link = p.Element("link").Value, 
       Comments = p.Element("comments").Value, 
       PubDate = DateTime.Parse(p.Element("pubDate").Value) 
      }).ToList(); 

Vous pouvez maintenant parcourir les résultats.

foreach(var post in posts) 
{ 
    Console.WriteLine(post.Title); 
    Console.WriteLine(post.Link); 
    Console.WriteLine(post.Comments); 
    Console.WriteLine(post.PubDate); 
} 

Ici, je viens d'utiliser un type anonyme pour capturer la sortie, mais ne hésitez pas à créer votre propre classe BlogPost ou quelque chose de similaire que vous pouvez utiliser dans la requête LINQ.

Je suis habitué à C#, c'est pourquoi je l'ai utilisé dans ma réponse. Mais vous pouvez facilement le convertir. Il y a quelques online converters que vous pouvez utiliser.

En ce qui concerne votre problème avec le DataSet (que je n'utiliserais personnellement pas pour implémenter cela), il est causé par un élément (blog) ayant des nœuds avec le même nom.

Par exemple:

<comments>...</comments> 
<slash:comments>5</slash:comments> 

Bien sûr, le second a un espace de noms différent (slash), mais la méthode ReadXml (...) de DataSet ne se soucie pas namespaces. Il essaie de créer une deuxième colonne nommée "commentaires". C'est pourquoi vous obtenez l'exception.

Vous pouvez toujours utiliser un DataSet/DataTable si vous le souhaitez. Il suffit d'extraire les données du flux en utilisant LINQ to XML comme indiqué ci-dessus.

Créez ensuite un DataSet et ajoutez-lui une nouvelle table.

var dataSet = new DataSet(); 
var blog = new DataTable("Blog"); 
blog.Columns.Add("Title", typeof(string)); 
blog.Columns.Add("Link", typeof(string)); 
blog.Columns.Add("Comments", typeof(string)); 
dataSet.Tables.Add(blog); 

itérer sur les données extraites et l'ajouter à la DataTable: méthode

foreach (var post in posts) 
{ 
    var newRow = blog.NewRow(); 
    newRow["Title"] = post.Title; 
    newRow["Link"] = post.Link; 
    newRow["Comments"] = post.Comments; 

    blog.Rows.Add(newRow); 
} 

Voila, nous avons maintenant fixé votre problème en ne se fondant sur ReadXml (...) du DataSet. Téléchargez le flux, extrayez les données qui vous intéressent et persistez.

+0

Merci! C'est beaucoup mieux que d'utiliser une table de données. Y at-il un moyen de trier les messages par date (juste pour être sûr que les messages les plus courants sont en haut)? – Zishan

+1

@Christophe: nous avons RSS intégré dans la bibliothèque de classes de base depuis .NET 3.5. Vous pouvez charger le RSS avec deux lignes de code. –

+0

@Zishan: Bien sûr, il suffit de trier le message IEnumerable (par exemple posts.OrderByDescending (p => p.PubDate);) –

3

Je commencerai par la construction dans les classes pour RSS/Atom: SyndicationFeed

using (XmlReader reader = XmlReader.Create(url)) 
{ 
    return SyndicationFeed.Load(reader); 
} 
5

Je commencerais dans l'espace de noms System.ServiceModel.Syndication, il y a des classes pour manipuler directement les flux RSS. En particulier, cela semble prometteur:

XmlReader reader = XmlReader.Create("http://your.uri.here/feed.xml"); 
SyndicationFeed feed = SyndicationFeed.Load(reader); 

Puis la classe Explorons SyndicationFeed, notamment la collecte Items doit contenir les entrées RSS.

0

C'est tout simplement excellente solution de @Christophe Geers converti en VB, en fonction:

Protected Function getWordPressFeed(ByVal strUrl As String) As DataTable 

    Dim rssFeed = New Uri(strUrl) 
    Dim request = DirectCast(WebRequest.Create(rssFeed), HttpWebRequest) 
    request.Method = "GET" 
    Dim response = DirectCast(request.GetResponse(), HttpWebResponse) 
    Dim feedContents As String 
    Using reader = New StreamReader(response.GetResponseStream()) 
     feedContents = reader.ReadToEnd() 
    End Using 
    Dim document = XDocument.Parse(feedContents) 

    Static Dim dcNamespace As XNamespace 
    dcNamespace = "http://purl.org/dc/elements/1.1/" 

    Dim posts = (From p In document.Descendants("item") Select New With { _ 
     Key .Title = p.Element("title").Value, _ 
     Key .Link = p.Element("link").Value, _ 
     Key .Author = p.Element(dcNamespace + "creator").Value, _ 
     Key .Description = p.Element("description").Value, _ 
     Key .PubDate = DateTime.Parse(p.Element("pubDate").Value) _ 
    }).ToList() 

    Dim dataSet = New DataSet() 
    Dim blog = New DataTable("Blog") 
    blog.Columns.Add("Title", GetType(String)) 
    blog.Columns.Add("Link", GetType(String)) 
    blog.Columns.Add("Description", GetType(String)) 
    blog.Columns.Add("Author", GetType(String)) 
    blog.Columns.Add("PubDate", GetType(DateTime)) 

    dataSet.Tables.Add(blog) 
    For Each post In posts 
     Dim newRow = blog.NewRow() 
     newRow("Title") = post.Title 
     newRow("Link") = post.Link 
     newRow("Description") = post.Description 
     newRow("Author") = post.Author 
     newRow("PubDate") = post.PubDate 
     blog.Rows.Add(newRow) 
    Next 

    Return blog 

End Function 
0

C'est ce que je l'utilise pour mon lecteur de flux wordpress.

private async void ReadFeed() { 
    var rssFeed = new Uri("http://truestrengthmd.com/category/blog/feed"); 

    var request = (HttpWebRequest)WebRequest.Create(rssFeed); 
    request.Method = "GET"; 
    var _response = await request.GetResponseAsync(); 
    var response = (HttpWebResponse)_response; 

    using (var reader = new StreamReader(response.GetResponseStream())) 
    { 
     var feedContents = reader.ReadToEnd(); 

     var document = XDocument.Parse(feedContents); 

     var posts = (from p in document.Descendants("item") 
        select new 
        { 
         Title = p.Element("title").Value 
        }).ToList(); 

     foreach (var post in posts) 
     { 
      Debug.WriteLine(post.Title); 
     } 
    } 
} 
0

Vous pouvez utiliser ma bibliothèque pour cela: wprssapi.marcogriep.de

Juste quelques lignes de code. Très facile à faire:

//Get an Instance of Wordpress Controller (Singleton) 
       WordPressFeedController wp = WordPressFeedController.Instance; 

       //Load all the RSS Articles 
       wp.LoadRSS("http://www.its-all-about.de/rss"); 

       //Get the Newest Article (Check Docs for other functions) 
       var rssItem = wp.GetNewestItem(); 

       this.label1.Text = rssItem.Title; 

       //Text Only, Remove all the HTML Tags - Limit too 300 Chars 
       this.richTextBox1.Text = wp.RemoveHTMLFromText(rssItem.Summary.Substring(0, 300)) + "..."; 

       //Open RSS Article on Button Click 
       this.button1.Click += (s, e) => { 
        Process.Start(rssItem.Id); 
       }; 
Questions connexes