自分のRSSリーダー

かつて、5年目の半ばに、同級生からラボの支援を依頼されました。
C#、彼女はそれを勉強しただけだから。 「RSSリーダーを作成する」というタスクを学習し、評価する
状況-学期の終わり-RSSリーダーが必要だったので、私は彼女を助けることにしました。


理論のビット



RSSはWebコンテンツ転送形式です。 テクノロジー名-頭字語「Really Simple」
シンジケーション「つまり、「情報の本当に簡単な転送」。」
RSSはXMLの方言です。 すべてのRSSファイルは、WWW Consortium(W3C)Webサイトで公開されているXML1.0仕様に準拠する必要があります。
最高レベルでは、RSSドキュメントは必須属性を持つ< rss >要素です
バージョンを示すバージョン
RSS(ところで、アプリケーションをRSS 2.0に基づいて作成しました)。 子要素< rss >
-チャネル情報(メタデータ)を含む1つの< channel >要素
およびその内容。
RSS 2.0ファイルの例は次のようになります。
<? xml バージョン = "1.0" >
< rss version = "2.0" >

< チャンネル >

< title >リフトオフニュース</ title >

< リンク > liftoff.msfc.nasa.gov </ リンク >

< 説明 >宇宙探査への打ち上げ。 </ 説明 >


< アイテム >

< title >スターシティ</ title >

< リンク > liftoff.msfc.nasa.gov/news/2003/news-starcity.asp </ リンク >

< 説明 >
アメリカ人はどのようにロシア人と一緒に働く準備をしますか
国際宇宙ステーション? 彼らは文化、言語の短期コースを取ります
ロシアのスターシティでのプロトコル。
</ 説明 >

< pubDate >火、2003年6月3日09:39:21 GMT </ pubDate >

</ アイテム >


< アイテム >

< title >宇宙探査</ title >

< リンク > liftoff.msfc.nasa.gov </ リンク >

< 説明 >
ヨーロッパ、アジア、アラスカおよびカナダの一部のスカイウォッチャー
5月31日土曜日に部分日食を経験します。
</ 説明 >

< pubDate > 2003年5月30日金曜日11:06:42 GMT </ pubDate >

</ アイテム >

</ チャンネル >
</ rss >



かなりシンプルなファイル。 彼は私たちに何を与えますか? まず、チャネル(チャネル、
フィード)と、それに関するさまざまな情報-見出し、公式ウェブサイトへのリンク、
チャンネルの説明など)。 第二に、記事/ニュース/エントリのリスト(アイテム)を呼び出します
必要なもの、およびこれらのエントリのプロパティ:タイトル、リンク、説明、発行日。
実際、チャンネルと録音の両方のプロパティははるかに大きくなる可能性があります。 それらのすべて
rss 2.0仕様で指定されています。 アレクセイ・ベシェノフによって作成された彼女の翻訳はここにあります 。 仕様の最新バージョンが利用可能です。
こちらをご覧ください
rssが提供する情報を使用するには、3つのクラスが必要です。
チャネルストレージ、 RssFeedと呼びましょう。
レコードのリストを保存するクラス-RssItems ; ストレージクラス
レコード-RssItem

フォーム作成


Microsoft Visual Studio 2005(<span
lang = "ru"> LinuxoidsはMonoDevelopを開き、新しいアプリケーションを作成します。 彼に電話しましょう
RssReader。 インターフェースはシンプルです:

フォームに配置する必要がある最初のメインコントロールはTableLayoutPanelです
完全な形状に引き伸ばされます(ドック=塗りつぶし)。 これは非常に便利なコントロールです。
インターフェイスの任意の要素を配置できる各セルのテーブル
(要素は、テーブルの複数の列および/または行を同時に占有できます)。 寸法
列は固定することも、表のサイズの割合として示すこともできます。
これは、テーブルのサイズを変更するときに非常に便利です。
残りの要素の目的は理解できると思います。TextBox-入力チャネルアドレス。 ボタン -フィードを更新するためのボタン。 リストビューで
-エントリのリストが表示されます。 WebBrowserで -コンテンツが表示されます
レコード。
それでは、リーダー自体の開発を始めましょう。 下から、つまりクラス<spanから開始します
lang = "en-us"> RssItem 、次にクラス<spanを作成
lang = "en-us"> RssItems
最後に書かれます
Rssfeed

Rssitem


このクラスは、レコード情報を提供します。 rss 2.0仕様による
「すべての< item >要素はオプションですが、少なくとも
< title >または< description >が存在する必要があります。
プロジェクトに新しいクラスを追加し、それをRssItemと呼びましょう。 その結果、次の結果が得られます。
を使用して
システム
System.Collections.Generic を使用します。
using System.Text;

名前空間 RssReader

{
クラス RssItem
{
}
}

クラスは、エントリに関する最小限の情報を保存します:タイトル(タイトル)、リンク
(全文へのリンク)と説明(メッセージの簡単な概要)。 に追加
この情報を保存するクラス3パブリックフィールド:
クラス RssItem
{
パブリック ストリングタイトル。 //レコードのタイトル
公開
文字列リンク。 //へのリンク
全文
パブリック 文字列の説明。 //レコードの説明
}


次に、これらのプロパティを設定するコンストラクターを追加します。 デザイナーの入り口で
rssから特定のエントリを渡す必要があります。 rssは単なる方言なので
XMLの場合、 < item >ブランチをコンストラクターに渡します。 はい 次のコンストラクタ
結果のレコード内の各タグをループし、会議
必要なタグ、その情報を対応するクラスプロパティに書き込みます。 実装者
次のようになります。
///

///レコードを埋めるためのコンストラクタ

///
/// <param
name = "ItemTag">読み取るXMLタグ
公開
RssItem( XmlNode ItemTag)

{

//
すべての投稿タグを表示

foreachXmlNode xmlTag in
ItemTag.ChildNodes)

{

//タグ名を確認する場合
先行予約の1つに対応し、

//その後
オブジェクトの対応するプロパティはタグのコンテンツです

スイッチ (xmlTag.Name)

{
ケース 「タイトル」

{

this .Title = xmlTag.InnerText;

休憩 ;
}
ケース
「説明」

{
this .Description = xmlTag.InnerText;

休憩 ;

}

ケース
「リンク」

{

この .Link
= xmlTag.InnerText;

休憩 ;

}

}

}

}

はい、ところで、私たちは<font color = "#2B91AF"
face = "Courier New" size = "2"> XmlNode、有効にする必要があります
<font color = "#0000ff" face = "Courier New"の対応するアセンブリ
size = "2">セクションを使用:
を使用して
System.Xml;

Rssitems


このクラスは、すべてのフィードエントリのリストです。 実装します
ジェネリック、つまり、私のお気に入りのジェネリッククラスを通じて
一覧
そして、私はこのジェネリックが好きです。
データセット。
プロジェクトに新しいクラスを追加し、それをRssItemsと呼びます。 次のものが得られます。
を使用して
システム
System.Collections.Generic を使用します。

using System.Text;
名前空間
Rssreader

{

クラス RssItems

{

}

}

次に、 RssItemsを継承します
Tを指定する代わりに、 List
オブジェクトがリストに保存されるタイプ。 同時に、Containsメソッドをオーバーライドし、
リスト内のエントリの存在をタイトルで判別するため。
///

///指定されたものの存在を確認する
リストアイテム
///

///比較用のオブジェクト

///オブジェクトがリストにある場合はtrue、そうでない場合


新しい
公開
bool Contains( RssItemアイテム)

{

foreachこの中の RssItem itemForCheck)

{

//
レコードヘッダーを比較する

もし
(Item.Title == itemForCheck.Title)

{

//見つかった
偶然。 真実を返す

帰る
本当

}

}

//
一致するものは見つかりませんでした。 嘘を返す

帰る


}

また、興味のあるリストからエントリを取得できると便利です。
彼女のタイトルを使用します。 これを行うには、Containsメソッドに似た別のメソッドを作成します。
///

///リストからエントリを取得します。
タイトル
///

///エントリのタイトル

///レコードが存在する場合は、戻ります。
そうでない場合はnullが返されます
public RssItem GetItem( 文字列タイトル)

{ foreachRssItem itemForCheck in this

{

//
レコードのタイトルとリクエストを比較する

もし
(Item.Title ==タイトル)

{

//一致が見つかりました。
見つかったレコードを返します

帰る
itemForCheck;

}

}

//一致が見つかりません。

nullを 返し ます

}

Rssfeed


それで、私たちはリーダーのメインクラスに到達しました。
このクラスはチャンネル情報を保存します。 必須のrss 2.0仕様による
チャネル要素は次のとおりです。 < title > -name
人々がサービスを参照するためのチャネル。 < link > -チャンネルに関連付けられているWebサイトのURL。 < description > -チャネルを説明するフレーズまたは文。
新しいクラスをプロジェクトに再度追加し、 RssFeedと呼びます。
を使用して
システム
System.Collections.Generic を使用します。

using System.Text;


名前空間 RssReader

{
クラス RssFeed

{

}
}

チャネルの上記のすべてのプロパティが必要なので、追加する必要があります
それらと私たちのクラスに。 また、 RssItemsタイプのプロパティを追加して、チャンネルエントリのリストを保存します。
クラス RssFeed

{
public String Title;
//チャネルヘッダー

公開
文字列の説明。 //
チャンネルの説明

公開
文字列リンク //へのリンク
チャンネル関連のウェブサイト

公開
RssItemsアイテム; //チャネルエントリのリスト

}

今やるべきことは、クラスコンストラクタを書くことです。
パラメータとして、rssチャネルへのリンクを受け取ります。rssが実際に存在する場合
存在する場合、作成されたオブジェクトのプロパティにrssのデータを入力します(コードが
質問はありません、私はそれについて詳しくコメントしようとしました):
///

///データを入力するためのコンストラクタ
チャンネル
///
///チャンネルアドレス
公開
RssFeed( 文字列 URL)

{

//
レコードのリストを初期化する

アイテム= 新規
RssItems ();

// Rssを読み取るリーダーを作成します
指定住所

XmlTextReader
xmlTextReader =新しいXmlTextReader (Url);

//新しいxmlドキュメントを作成して、無関係なものに書き込みます
RSSフィード

XmlDocument xmlDoc =新規
XmlDocument ();

試してみる

{

//リーダーを使用してRSSをドキュメントに読み込みます

xmlDoc.Load(xmlTextReader);

//リーダーを閉じます
不要

xmlTextReader.Close();

//
すべてのRSSフィード情報はタグ間に書き込まれるため、
//ロードして、このブランチを取得します。

XmlNode channelXmlNode = xmlDoc.GetElementsByTagName( "channel" )[0];

// if
ブランチが存在する場合、オブジェクトのプロパティを設定し始めます
//ブランチからのデータ

もし
(channelXmlNode!= null

{

//タグのすべての子孫を反復処理します

foreachXmlNode
channelXmlNode.ChildNodesのchannelNode)

{

//子孫タグの名前が興味のある場合、
彼のデータを書く

//特定の
オブジェクトのプロパティ

スイッチ
(channelNode.Name)

{

ケース
「タイトル」

{

タイトル=
channelNode.InnerText;

休憩 ;

}

ケース 「説明」

{

説明=
channelNode.InnerText;

休憩 ;

}

ケース 「リンク」

{

リンク= channelNode.InnerText;

休憩 ;

}

case “ item”//チェックされたタグの名前がitemの場合、

{

//このタグから新しいタグを作成します
レコードタイプオブジェクト

Rss <スパン
lang = "en-us">アイテム channelItem = new
RssItem (channelNode);

//そして追加する
チャンネルレコードリスト

Items.Add(channelItem);

休憩 ;

}

}

}

}

他に
//
受信したファイルにタグが見つからない場合、例外をスローします

{

新しい例外をスロー「XMLエラー。チャネルの説明が見つかりません!」 );

}

}

//チャネルのURLが指定されていない場合、スロー
ソース使用不可例外
つかまえる
(System.Net.WebException ex)

{

if (例:ステータス
== System.Net.WebExceptionStatus.NameResolutionFailure)

新しい例外をスロー「指定されたソースに接続できません。\ r \ n」 +
Url);

他の スロー
例;

}

// RSSアドレスが指定された場合
まだ存在しないローカルパス、

//
次に、対応する例外をスローします

つかまえる
(System.IO.FileNotFoundException)

{

新しい投げる
例外( “ File” + Url +
見つかりません!” );

}

//そして最後に、すべてをキャッチ
その他の例外、およびそのまま渡す

catch (例外ex)

{

投げる
例;

}

ついに

{

//
リーダーを閉じます

xmlTextReader.Close();

}

}

最終段階


さて、クリックするためのイベントハンドラーのコードを書くだけです。
ListViewの「更新」ボタンと項目選択、およびロードされたチャネルが保存されるグローバル変数CurrentFeedを追加します。

//
チャネルデータを格納するグローバル変数

Rssfeed
CurrentFeed;


//更新ボタンを押す処理
private void btRefresh_Click( オブジェクト送信者、 EventArgs
e)

{

//アドレスが設定されているかどうかを確認します

if (! String .IsNullOrEmpty(tbUrl.Text))

{

//新しいデータを追加する前にListViewをクリアします

lvNews.Clear();

//チャネルを初期化します

CurrentFeed = 新しい RssFeed (tbUrl.Text);

foreachrss <span
lang = "en-us">アイテム feedItem in
CurrentFeed.Items)

{

// ListViewで出力する要素を作成します

ListViewItem listViewItem = new ListViewItem(feedItem.Title);

//名前を設定します

listViewItem.Name = feedItem.Title;

// ListViewに配置します

lvNews.Items.Add(listViewItem);

}

}

}

// ListViewで変更アイテムの選択を処理します
private void lvNews_SelectedIndexChanged( オブジェクト送信者、 EventArgs
e)

{

//選択したListViewItemに関連するニュースを取得します

if (lvNews.SelectedItems.Count> 0
&& //何かが実際に選択されていることを確認する

CurrentFeed!= Null
&& //チャネルが初期化されていることを確認

CurrentFeed.Items.Count> 0
//チャネル内のレコードの存在を確認します



{

//選択したレコードの全文を表示します

wbDescription.DocumentText =
CurrentFeed.Items.GetItem(lvNews.SelectedItems [0] .Text).Description;
}
}

おわりに


その結果、標準の2.0フィードを読み取ることができるシンプルなRSSリーダーを入手しました。
次の記事では、クラスをより多くする方法を説明しようとします。
普遍的で、訪問した履歴の保存を整理する方法
テープ。
書かれたリーダーのソースはここからダウンロードできます。

PS:建設的な批判、提案、提案は大歓迎です。

Ramil Aliyakberov別名R @ Me0!

*すべてのソースコードは、 ソースコードハイライターを使用して強調表示されました。

Source: https://habr.com/ru/post/J27443/


All Articles