You can use LINQ to XML to read WordPress RSS feeds.
Get the feed first. Retrieve the Uri instance.
var rssFeed = new Uri("http://cgeers.com/feed/");
Then execute the GET request.
var request = (HttpWebRequest) WebRequest.Create(rssFeed); request.Method = "GET"; var response = (HttpWebResponse) request.GetResponse();
Get the response stream and read it to download the contents of the feed.
using (var reader = new StreamReader(response.GetResponseStream())) { var feedContents = reader.ReadToEnd();
In the using statement above, use LINQ to XML to parse the loaded content and extract the necessary information.
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();
Now you can iterate over the results.
foreach(var post in posts) { Console.WriteLine(post.Title); Console.WriteLine(post.Link); Console.WriteLine(post.Comments); Console.WriteLine(post.PubDate); }
Here I just used an anonymous type to input the output, but feel free to create your own BlogPost class or something similar that you can use in your LINQ query.
I'm used to C #, so I used it in my answer. But you can easily convert it. There are several online converters that you can use.
As for your problem with the DataSet (which I personally would not use to implement this), this is because the element (blog post) has nodes with the same name.
For instance:
<comments>...</comments> <slash:comments>5</slash:comments>
Of course, the second one has a different namespace (slash), but the DataSet ReadXml (...) method is not interested in the namespace. He is trying to create a second column called "comments". That is why you get an exception.
You can still use a DataSet / DataTable if you want. Just retrieve the data from the feed using LINQ to XML as shown above.
Then create a DataSet and add a new table to it.
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);
Iterate over the extracted data and add it to the DataTable:
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, we have now fixed your problem by no longer relying on the DataSet ReadXml (...) method. Download the feed, extract the data you are interested in and save it.