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);
}

ここでは匿名型を使用して出力をキャプチャしましたが、LINQ クエリで使用できる独自の BlogPost クラスまたは同様のものを自由に作成してください。

私は C# に慣れているので、返信で C# を使用しました。でも簡単に変換できます。使用できるオンラインコンバーターがいくつかあります。

DataSet に関する問題 (個人的にはこれを実装するために使用しません) については、同じ名前のノードを持つアイテム (ブログ投稿) が原因です。

例えば:

<comments>...</comments>
<slash:comments>5</slash:comments>

確かに 2 つ目の名前空間 (スラッシュ) は異なりますが、DataSet の ReadXml(...) メソッドは名前空間を気にしません。「コメント」という名前の 2 番目の列を作成しようとします。そのため、例外が発生します。

必要に応じて、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

これは、関数としてVBに変換された@Christophe Geersの優れたソリューションです。

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 に答える