14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

プロ生ちゃんAdvent Calendar 2015

Day 10

[C# / LINQ to XML] すぱこーRSSフィードからデータを取得してみよう

Last updated at Posted at 2015-12-09

こんにちはー!ニアです。

今回はC#とLINQ to XMLを使って「すぱこー RSS フィード | プログラミング生放送」のRSSフィードから、チャンネル情報と各話のデータを取得していきます。

#1. すぱこーRSSフィードの構成

すぱこー RSS フィード | プログラミング生放送」にある要素の一覧より、RSSフィードの構成は以下のようになっています。

すぱこーRSSフィードの構成
<rss version="2.0" xmlns:p="http://pinga.mu/terms/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcndl="http://ndl.go.jp/dcndl/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>作品タイトル</title>
    <link>作品の URL</link>
    <description>作品の説明</description>
    <pubDate>最新話の公開日(RFC 822規定の日付形式)</pubDate>
    <image>作品のバナー画像 URL</image>
    <dc:creator>作者名</dc:creator>
    <item>
      <title>タイトル</title>
      <dc:creator>作者名</dc:creator>
      <link>作品の URL</link>
      <pubDate>公開日(RFC 822規定の日付形式)</pubDate>
      <description>あらすじ</description>
      <dcndl:volume>話数</dcndl:volume>
      <dc:modified>投稿記事の更新日(RFC 822規定の日付形式)</dc:modified>
      <p:isAvailable>利用可能かどうか(通常はtrue)</p:isAvailable>
      <media:content url="漫画画像 URL"></media:content>
      <media:thumbnail url="漫画サムネイル URL"></media:thumbnail>
      <guid isPermaLink="false">ID</guid>
    </item>
    <item>
    ...
    </item>
    ...
  </channel>
</rss>

#2. LINQ to XMLとは?
LINQ(Language Integrated Query)とは、リストやデータベース、XMLなどの操作(要素の列挙や抽出、統計などのクエリ機能)をプログラミング言語から利用できる機能です。

LINQ to XMLは、XMLデータに対してLINQを利用することができます。

#3. C#とLINQ to XMLですぱこーRSSフィードを取得してみよう

今回はコンソールアプリで、すぱこーRSSフィードの取得し、データを出力していきます。

LINQ to XMLを利用するには、System.Xml.Linq名前空間を使用します。

SpacoFeedTrial.cs
using System;
using System.Collections.Generic;
using System.Xml.Linq;

class Program {

	static void Main( string[] args ) {
		// すぱこーRSSフィードのURLです。(最新の5話分だけ取得します)
		string url = @"http://pronama-api.azurewebsites.net/feed/spaco?count=10";
		// すぱこーRSSフィードで使用している名前空間です。
		XNamespace p = @"http://pinga.mu/terms/";
		XNamespace media = @"http://search.yahoo.com/mrss/";
		XNamespace dcndl = @"http://ndl.go.jp/dcndl/terms/";
		XNamespace dc = @"http://purl.org/dc/elements/1.1/";

		Console.Write( "すぱこーRSSフィードの取得中... " );
		try {
			// すぱこーRSSフィードを読み込みます。

			Console.WriteLine( "完了!" );

			// すぱこーRSSフィードのデータの取得&出力します。

		}
		catch( Exception ex ) {
			Console.WriteLine( $"エラー : {ex.Message}" );
		}

	}
}

##3.1. RSSフィードを読み込む
まず、XElementクラスLoadメソッドでRSSフィードを読み込みます。

すぱこーRSSフィードの読み込み
// すぱこーRSSフィードを読み込みます。
XElement spx = XElement.Load( url );

※読み込むRSSフィードのデータサイズが大きいと、時間がかかります。

##3.2. RSSフィードからチャンネル情報を取得する

RSSフィードを読み込んだら、チャンネル情報と各話のデータを取得していきます。

チャンネル情報はchannel要素内にあります。XElementクラスのElementメソッドでchannel要素を取得します。

channel要素の取得
// すぱこーRSSフィードのデータの取得&出力します。
XElement spxChannel = spx.Element( "channel" );

取得したchannel要素から、XElementクラスのElementメソッド(XMLDOMでいうSelectSingleNodeです)でチャンネル情報の各要素を取得し、Valueプロパティでデータを取り出します。

※Valueプロパティの戻り値の型は**文字列(string)**です。

また、RSSフィードで使われている日付の文字列は**「RFC 822」の日付形式となっており、DateTime構造体のParseメソッド**でDateTime型に変換することができます。

channel要素からチャンネル情報を取得
// チャンネル情報を取得します。
Console.WriteLine( $"タイトル : {spxChannel.Element( "title" ).Value}" );
Console.WriteLine( $"概要 : {spxChannel.Element( "description" ).Value}" );
Console.WriteLine( $"最終更新日 : {DateTime.Parse( spxChannel.Element( "pubDate" ).Value )}" );
Console.WriteLine( $"リンク : {spxChannel.Element( "link" ).Value}" );

##3.3. LINQを使って、各話のデータを取得する
各話のデータはitem要素内にあります。XElementクラスのElementsメソッド(XMLDOMでいうSelectSingleNodeです)でitem要素のコレクションを取得します。

item要素のコレクションを取得
// 各話のデータを取得します。
IEnumerable<XElement> spxItems = spxChannel.Elements( "item" );

取得したitem要素のコレクションはIEnumerable<XElement>型なので、LINQを利用することができます!

ここではforeach文でコレクションの各要素(XElement型)を列挙し、各話のデータを取得してコンソール画面に表示します。

XElementクラスのElementメソッド及びElementsメソッドで、名前空間付きの要素を指定する時には、「名前空間名(XNamespace型)」と「要素名(XName型)」を加算演算子(+)で結合した文字列を使用します。

各話のデータを取得して表示
Console.WriteLine( "\n各話の情報" );
foreach( var item in spxItems ) {
	Console.WriteLine( $"◆ 第{int.Parse( item.Element( dcndl + "volume" ).Value )}話" );
	Console.WriteLine( $" タイトル : {item.Element( "title" ).Value}" );
	Console.WriteLine( $" 作者 : {item.Element( dc + "creator" ).Value}" );
	Console.WriteLine( $" 公開日 : {DateTime.Parse( item.Element( "pubDate" ).Value )}" );
	Console.WriteLine( $" リンク : {item.Element( "link" ).Value}" );
}

完成したプログラムを以下に示します。

SpacoFeedTrial.cs
using System;
using System.Collections.Generic;
using System.Xml.Linq;

class Program {

	static void Main( string[] args ) {
		// すぱこーRSSフィードのURLです。(最新の5話分だけ取得します)
		string url = "http://pronama-api.azurewebsites.net/feed/spaco?count=5";
		// すぱこーRSSフィードで使用している名前空間です。
		XNamespace p = @"http://pinga.mu/terms/";
		XNamespace media = @"http://search.yahoo.com/mrss/";
		XNamespace dcndl = @"http://ndl.go.jp/dcndl/terms/";
		XNamespace dc = @"http://purl.org/dc/elements/1.1/";

		Console.Write( "すぱこーRSSフィードの取得中... " );
		try {
			// すぱこーRSSフィードの読み込みます。
			XElement spx = XElement.Load( url );
			Console.WriteLine( "完了!" );

			// すぱこーRSSフィードのデータの取得&出力します。

			// チャンネル情報を取得します。
			XElement spxChannel = spx.Element( "channel" );

			Console.WriteLine( $"タイトル : {spxChannel.Element( "title" ).Value}" );
			Console.WriteLine( $"概要 : {spxChannel.Element( "description" ).Value}" );
			Console.WriteLine( $"最新話公開日 : {DateTime.Parse( spxChannel.Element( "pubDate" ).Value )}" );
			Console.WriteLine( $"リンク : {spxChannel.Element( "link" ).Value}" );

			// 各話のデータを取得します。
			IEnumerable<XElement> spxItems = spxChannel.Elements( "item" );
			Console.WriteLine( "\n各話の情報" );
			foreach( var item in spxItems ) {
				Console.WriteLine( $"◆ 第{int.Parse( item.Element( dcndl + "volume" ).Value )}話" );
				Console.WriteLine( $" タイトル : {item.Element( "title" ).Value}" );
				Console.WriteLine( $" 作者 : {item.Element( dc + "creator" ).Value}" );
				Console.WriteLine( $" 公開日 : {DateTime.Parse( item.Element( "pubDate" ).Value )}" );
				Console.WriteLine( $" リンク : {item.Element( "link" ).Value}" );
			}

		}
		catch( Exception ex ) {
			Console.WriteLine( $"エラー : {ex.Message}" );
		}

	}
}

実行結果

すぱこーRSSフィードの取得中... 完了!
タイトル : すぱこー
概要 : 高校生の暮井 慧(プロ生ちゃん)と、部活「情報処理研究会」のメンバー 戸増千由莉とフィネス・ヒルヴィレッジが活躍する Web 4コマ漫画「すぱこー」!
最新話公開日 : 2015/11/15 21:30:39
リンク : http://pronama.azurewebsites.net/tag/spaco/

各話の情報
◆ 第41話
 タイトル : すぱこー Ver. 41
 作者 : 池村ヒロイチ
 公開日 : 2015/11/15 21:30:39
 リンク : http://pronama.azurewebsites.net/2015/11/15/web-comic-spaco-41/
◆ 第40話
 タイトル : すぱこー Ver. 40
 作者 : 池村ヒロイチ
 公開日 : 2015/11/04 23:13:28
 リンク : http://pronama.azurewebsites.net/2015/11/04/web-comic-spaco-40/
◆ 第39話
 タイトル : すぱこー Ver. 39
 作者 : 池村ヒロイチ
 公開日 : 2015/10/07 13:16:36
 リンク : http://pronama.azurewebsites.net/2015/10/07/web-comic-spaco-39/
◆ 第38話
 タイトル : すぱこー Ver. 38
 作者 : 池村ヒロイチ
 公開日 : 2015/10/03 23:41:44
 リンク : http://pronama.azurewebsites.net/2015/10/03/web-comic-spaco-38/
◆ 第37話
 タイトル : すぱこー Ver. 37
 作者 : 池村ヒロイチ
 公開日 : 2015/08/18 22:38:46
 リンク : http://pronama.azurewebsites.net/2015/08/18/web-comic-spaco-37/

それでは、See you next!

#関連サイト

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?