6

如何使用我的 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

但它在这一行出错: 'ds.ReadXml(reader)' 出现以下错误:

A column named 'comments' already belongs to this DataTable.

也许它不起作用,因为此代码来自 2003 年?有人有工作代码示例吗?提前谢谢了!

4

6 回答 6

20

您可以使用 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(...) 方法解决了您的问题。下载提要,提取您感兴趣的数据并将其持久化。

于 2012-06-25T18:14:57.193 回答
6

我将从System.ServiceModel.Syndication命名空间开始,有一些类可以直接操作 RSS 提要。特别是,这看起来很有希望:

 XmlReader reader = XmlReader.Create("http://your.uri.here/feed.xml");
 SyndicationFeed feed = SyndicationFeed.Load(reader);

然后探索SyndicationFeed类,特别是Items集合应该包含 RSS 条目。

于 2012-06-25T18:43:53.850 回答
3

我将从 RSS/Atom 的内置类开始:SyndicationFeed

using (XmlReader reader = XmlReader.Create(url))
{
    return SyndicationFeed.Load(reader);
}  
于 2012-06-25T18:43:29.897 回答
0

这只是@Christophe Geers 转换为 VB 的绝佳解决方案,作为一个函数:

Protected Function getWordPressFeed(ByVal strUrl As String) As DataTable

    Dim rssFeed = New Uri(strUrl)
    Dim request = DirectCast(WebRequest.Create(rssFeed), HttpWebRequest)
    request.Method = "GET"
    Dim response = DirectCast(request.GetResponse(), HttpWebResponse)
    Dim feedContents As String
    Using reader = New StreamReader(response.GetResponseStream())
        feedContents = reader.ReadToEnd()
    End Using
    Dim document = XDocument.Parse(feedContents)

    Static Dim dcNamespace As XNamespace
    dcNamespace = "http://purl.org/dc/elements/1.1/"

    Dim posts = (From p In document.Descendants("item") Select New With { _
        Key .Title = p.Element("title").Value, _
        Key .Link = p.Element("link").Value, _
        Key .Author = p.Element(dcNamespace + "creator").Value, _
        Key .Description = p.Element("description").Value, _
        Key .PubDate = DateTime.Parse(p.Element("pubDate").Value) _
    }).ToList()

    Dim dataSet = New DataSet()
    Dim blog = New DataTable("Blog")
    blog.Columns.Add("Title", GetType(String))
    blog.Columns.Add("Link", GetType(String))
    blog.Columns.Add("Description", GetType(String))
    blog.Columns.Add("Author", GetType(String))
    blog.Columns.Add("PubDate", GetType(DateTime))

    dataSet.Tables.Add(blog)
    For Each post In posts
        Dim newRow = blog.NewRow()
        newRow("Title") = post.Title
        newRow("Link") = post.Link
        newRow("Description") = post.Description
        newRow("Author") = post.Author
        newRow("PubDate") = post.PubDate
        blog.Rows.Add(newRow)
    Next

    Return blog

End Function
于 2015-03-18T18:58:41.767 回答
0

这就是我用于我的 wordpress 提要阅读器的内容。

private async void ReadFeed() {
    var rssFeed = new Uri("http://truestrengthmd.com/category/blog/feed");

    var request = (HttpWebRequest)WebRequest.Create(rssFeed);
    request.Method = "GET";
    var _response = await request.GetResponseAsync();
    var response = (HttpWebResponse)_response;

    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        var feedContents = reader.ReadToEnd();

        var document = XDocument.Parse(feedContents);

        var posts = (from p in document.Descendants("item")
                     select new
                     {
                         Title = p.Element("title").Value
                     }).ToList();

        foreach (var post in posts)
        {
            Debug.WriteLine(post.Title);
        }
    }
}
于 2017-10-03T17:10:52.257 回答
0

您可以为此使用我的库:wprssapi.marcogriep.de

只需几行代码。很容易做到:

//Get an Instance of Wordpress Controller (Singleton)
                WordPressFeedController wp = WordPressFeedController.Instance;

                //Load all the RSS Articles
                wp.LoadRSS("http://www.its-all-about.de/rss");

                //Get the Newest Article (Check Docs for other functions)
                var rssItem = wp.GetNewestItem();

                this.label1.Text = rssItem.Title;

                //Text Only, Remove all the HTML Tags - Limit too 300 Chars
                this.richTextBox1.Text = wp.RemoveHTMLFromText(rssItem.Summary.Substring(0, 300)) + "...";

                //Open RSS Article on Button Click
                this.button1.Click += (s, e) => {
                    Process.Start(rssItem.Id);
                };
于 2018-02-02T12:55:07.827 回答