在ASP.NET中使用WordPress RSS Feed

Zis*_*han 5 c# vb.net asp.net

如何使用我的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,提取您感兴趣的数据并保留.


Wik*_*hla 6

我会从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条目.