您可以使用LINQ to XML來讀取WordPress RSS feed。
首先獲取Feed。製作一個Uri實例。
var rssFeed = new Uri("http://cgeers.com/feed/");
然後執行GET請求。
var request = (HttpWebRequest) WebRequest.Create(rssFeed);
request.Method = "GET";
var response = (HttpWebResponse) request.GetResponse();
獲取響應流並讀取它以下載該提要的內容。
using (var reader = new StreamReader(response.GetResponseStream()))
{
var feedContents = reader.ReadToEnd();
//...
}
仍然在上面的using語句中使用LINQ to XML來解析下載的內容並提取您需要的信息。
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();
現在您可以迭代結果。
foreach(var post in posts)
{
Console.WriteLine(post.Title);
Console.WriteLine(post.Link);
Console.WriteLine(post.Comments);
Console.WriteLine(post.PubDate);
}
這裏我只是用一個匿名類型來捕獲輸出,但隨時創建自己的博文類或類似的東西,你可以在LINQ查詢使用。
我習慣了C#,所以這就是爲什麼我在我的回覆中使用它。但你可以輕鬆地轉換它。有一些您可以使用的online converters。
關於DataSet的問題(我個人不會用它來實現這個問題),它是由具有同名節點的項目(博客文章)引起的。
例如:
<comments>...</comments>
<slash:comments>5</slash:comments>
當然,第二個有不同的命名空間(斜線),但數據集的的ReadXml(...)方法不關心的命名空間。它試圖創建名爲「comments」的第二列。這就是爲什麼你會得到例外。
如果需要,您仍然可以使用DataSet/DataTable。如上所示,只需使用LINQ to XML從提要中提取數據即可。
然後創建一個DataSet並向它添加一個新表。
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);
遍歷提取數據,並將其添加到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);
}
瞧,我們現在不再依靠DataSet的的ReadXml(...)方法固定您的問題。下載Feed,提取您感興趣的數據並堅持下去。
謝謝!這比使用數據表好得多。有沒有辦法按日期對帖子進行排序(只是爲了確保最新的帖子位於頂部)? – Zishan
@Christophe:自.NET 3.5以來,我們已將RSS構建到基類庫中。您可以使用兩行代碼加載RSS。 –
@Zhan:當然,只需要對IEnumerable進行排序(例如posts.OrderByDescending(p => p.PubDate);) –