如何使用我的WordPress博客的RSS源在我的主页上显示我最新的博客文章?我遇到了以下代码来执行此操作:
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
Run Code Online (Sandbox Code Playgroud)
但它在这一行错误:'ds.ReadXml(reader)',出现以下错误:
A column named 'comments' already belongs to this DataTable.
Run Code Online (Sandbox Code Playgroud)
也许它不起作用,因为这段代码来自2003年?有没有人有工作代码示例?提前谢谢了!
Chr*_*ers 19
您可以使用LINQ to XML来读取WordPress RSS提要.
首先得到饲料.制作一个Uri实例.
var rssFeed = new Uri("http://cgeers.com/feed/");
Run Code Online (Sandbox Code Playgroud)
然后执行GET请求.
var request = (HttpWebRequest) WebRequest.Create(rssFeed);
request.Method = "GET";
var response = (HttpWebResponse) request.GetResponse();
Run Code Online (Sandbox Code Playgroud)
获取响应流并读取它以下载源的内容.
using (var reader = new StreamReader(response.GetResponseStream()))
{
var feedContents = reader.ReadToEnd();
//...
}
Run Code Online (Sandbox Code Playgroud)
仍然在上面的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();
Run Code Online (Sandbox Code Playgroud)
现在您可以迭代结果.
foreach(var post in posts)
{
Console.WriteLine(post.Title);
Console.WriteLine(post.Link);
Console.WriteLine(post.Comments);
Console.WriteLine(post.PubDate);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我只使用匿名类型来捕获输出,但随意创建自己的BlogPost类或类似的东西,您可以在LINQ查询中使用.
我已经习惯了C#,所以这就是我在回复中使用它的原因.但你可以轻松转换它.您可以使用一些在线转换器.
关于您使用DataSet的问题(我个人不会用它来实现),它是由具有相同名称的节点的项目(博客文章)引起的.
例如:
<comments>...</comments>
<slash:comments>5</slash:comments>
Run Code Online (Sandbox Code Playgroud)
当然第二个具有不同的命名空间(斜杠),但DataSet的ReadXml(...)方法不关心命名空间.它尝试创建名为"comments"的第二列.这就是你得到例外的原因.
如果需要,您仍然可以使用DataSet/DataTable.只需使用LINQ to XML从feed中提取数据,如上所示.
然后创建一个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);
Run Code Online (Sandbox Code Playgroud)
迭代提取的数据并将其添加到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);
}
Run Code Online (Sandbox Code Playgroud)
瞧,我们现在已经修复了你的问题,不再依赖于DataSet的ReadXml(...)方法了.下载Feed,提取您感兴趣的数据并保留.
我会从System.ServiceModel.Syndication命名空间开始,有类直接操作RSS提要.特别是,这看起来很有希望:
XmlReader reader = XmlReader.Create("http://your.uri.here/feed.xml");
SyndicationFeed feed = SyndicationFeed.Load(reader);
Run Code Online (Sandbox Code Playgroud)
然后探索SyndicationFeed该类,特别是该Items集合应该包含RSS条目.