您可以使用 LINQ to XML 读取 WordPress RSS 提要。
首先获取饲料。用它制作一个 Uri 实例。
var rssFeed = new Uri("https://github.com/geersch/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);
}
在这里,我只是使用匿名类型来捕获输出,但您可以随意创建自己的 BlogPost 类或类似的东西,您可以在 LINQ 查询中使用它们。
我习惯了 C#,所以这就是我在回复中使用它的原因。但是你可以很容易地转换它。您可以使用一些在线转换器。
关于您对 DataSet 的问题(我个人不会使用它来实现它),它是由具有相同名称节点的项目(博客文章)引起的。
例如:
<comments>...</comments>
<slash:comments>5</slash:comments>
当然,第二个具有不同的命名空间(斜杠),但 DataSet 的 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(...) 方法解决了您的问题。下载提要,提取您感兴趣的数据并将其持久化。