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(...) メソッドに依存しなくなったことで、問題が修正されました。フィードをダウンロードし、関心のあるデータを抽出して保持します。