次の方法で共有


ASP.NET を使用したオンライン RSS ニュース アグリゲーターの作成

 

Scott Mitchell

2003 年 8 月改訂

適用対象:
    Microsoft® ASP.NET

概要: XML Web コントロールを使用してリモート XML データを取得する ASP.NET Web ページに XML データを表示する方法と、Repeater コントロールを使用してデータベースから XML データを出力する方法について説明します。 さまざまなプラットフォーム間でのデータ共有の要求が増え続ける中、XML の使用はここ数年で爆発的に増加しています。 この傾向を実現するために、Microsoft は、.NET Framework全体で堅牢な XML サポートを確実に含めるようにしました。 ASP.NET 開発者にとって、これは、Web ページでの XML データの表示と操作がかつてないほど簡単であることを意味します。 この記事では、RSS 2.0 配信エンジンとオンライン ニュース アグリゲーターを構築することで、XML と ASP.NET について説明します。 この記事では、読者が ASP.NET と XML に精通していることを前提としています。 (20ページ印刷)

RSSAggregator.msiをダウンロード します

内容

はじめに
RSS 2.0 を使用したコンテンツの配信
ASP.NET Web ページを使用した配信出力の作成
ASP.NET Web ページでの配信フィードの使用
配信フィードの一覧の表示
特定の配信フィードのニュース アイテムを表示する
特定のニュース アイテムの詳細を表示する
将来の機能強化と現在の欠点
まとめ

はじめに

家庭や企業で常時接続インターネット接続が増加し、World Wide Web とインターネットにアクセス可能なアプリケーションの爆発的な成長が続く中、アプリケーションが相互にデータを共有できることがますます重要になっています。 異なるプラットフォーム間でデータを共有するには、プラットフォームに依存しないデータ形式が必要です。この形式は、標準のインターネット プロトコルを介して簡単に送信できます。ここで XML が適合します。 XML ファイルは基本的に、よく知られているエンコーディングを持つ単純なテキスト ファイルであるため、一般的に使用されるすべてのプログラミング言語に XML パーサーが存在するため、XML データはどのプラットフォームでも簡単に使用できます。

XML を使用したデータ共有の良い例として、ニュース サイトや Web ログでよく見られる Web サイト シンジケーションがあります。 Web サイト シンジケーションを使用すると、Web サイトは XML 形式の Web アクセス可能なシンジケーション ファイルで最新のコンテンツを発行します。 使用されている配信形式は数多くあり、RSS 2.0 で人気のある形式の 1 つです。 (RSS 2.0 仕様 は、ハーバード法の技術サイトでオンラインで公開されています。さらに、MSDN® Magazine には配信ファイル MSDN Magazine: Current Issue があり、最新の MSDN マガジンの記事とオンライン バージョンへのリンクが一覧表示されています。

Web サイトが配信ファイルを公開すると、さまざまなクライアントが配信ファイルを使用することを決定できます。 配信ファイルを使用するには、さまざまな方法があります。 .NET リソース Web サイトを実行しているユーザーは、最新の MSDN マガジン記事の見出しを Web サイトに追加する必要がある場合があります。 配信ファイルは、ニュース アグリゲーター アプリケーションによって一般的に使用されます。これは、さまざまなソースから配信ファイルを取得して表示するように特別に設計されたアプリケーションです。

XML データに重点が置かれる中で、ASP.NET Web ページで XML データを操作できることは、これまで以上に重要になっています。 Web サイトシンジケーションが大流行しているため、この記事では、Web サイト 配信ファイル ジェネレーターとオンライン ニュース アグリゲーター アプリケーションを構築します。 この記事全体でこれら 2 つのミニ プロジェクトに取り組む際に、リモート Web サーバーとローカル ファイル システムの両方から XML データにアクセスして表示する方法について説明します。 Repeater コントロールの使用や、ASP.NET XML Web コントロールの使用など、さまざまな方法で XML データを表示する方法について説明します。

この記事には無制限のスペースがないため、現在 XSLT と XPath に精通していると仮定します。 そうでない場合は、この記事を続行する前に、次のリソースを読むことを検討してください。

RSS 2.0 を使用したコンテンツの配信

この記事で構築する最初のミニ アプリケーションは、シンジケーション ファイル ジェネレーターです。 このミニ アプリケーションでは、すべてのニュース記事が Microsoft® SQL Server ™ 2000 データベースに格納されている大規模なニュース サイト (MSNBC.com など) の Web 開発者として働いているとします。 具体的には、次のドイツ語フィールドと呼ばれるArticlesテーブルにアーティクルが格納されます。

  • ArticleID—各アーティクルを一意に識別する自動インクリメント主キー整数フィールド。
  • Title—a varchar(50), ニュースアイテムのタイトルを指定します,
  • Author—a varchar(50), ニュースアイテムの作成者を指定します,
  • Description—ニュース varchar(2000)アイテムの詳細な説明を提供する 。
  • DatePublished datetime— ニュースアイテムが公開された日付を示す 。

テーブルには他のArticlesフィールドが存在する可能性がありますが、シンジケーションに使用するフィールドは上記のフィールドのみです。 さらに、これは非常に簡略化されたデータ モデルです。実際の設定では、作成者用に別のテーブルを持つ、多対多のテーブルを持つ作成者や記事などを含む、より正規化されたデータベースが作成される可能性が高くなります。

次の手順では、最新のニュース アイテムの一覧を適切に書式設定された RSS 2.0 XML ファイルとして表示する ASP.NET Web ページを作成します。 ASP.NET Web ページでこの変換を実行する方法を調べる前に、まず RSS 2.0 の仕様を調べてみましょう。 仕様を見ながら、RSS はコンテンツを配信するデータ モデルを提供するように設計されていることに注意してください。 当然のことながら、コンテンツを配信する Web サイトに関する情報のための一連の XML 要素と、特定のニュース アイテムを記述するための一連の XML 要素があります。 最後に、XML 形式のファイルと同様に、RSS 配信ファイルは XML 形式のガイドラインに従う必要があります。つまり、次のことを忘れないでください。

  • すべての XML 要素が適切に入れ子になります。
  • すべての属性値を引用符で囲み、
  • 、、 &、 のすべてのインスタンス <は、それぞれ、、&quot; &amp; &gt;、および &apos; &lt;置き換えられます。'" >

さらに、XML ファイルでは大文字と小文字が区別されます。つまり、XML 要素の開始タグと終了タグは、大文字と小文字が区別され、スペル が一致している必要があります。

RSS 2.0 ファイルのルート要素は 要素<rss>です。 次のように、この要素にバージョン番号を指定できます。

<rss version="2.0">
  ...
</rss>

<rss> 要素には、シンジケートされたコンテンツを記述する 1 つの子要素 <channel>があります。 要素内<channel>には、シンジケート Web サイトに関する情報を記述するために使用される 3 つの必須の子要素があります。 次の 3 つの要素があります。

  • title—配信ファイルの名前を指定し、通常は Web サイトの名前を含みます。
  • link—Web サイトへの URL、および
  • description—Web サイトの簡単な説明。

Web サイトを記述するための省略可能な要素も多数あります。これらの要素の詳細については、 RSS 2.0 仕様 を参照してください。

各ニュース アイテムは、個々<item>の要素内に配置されます。 要素には<channel>、任意の数の要素を<item>含めることができます。 各<item>要素にはさまざまな子要素を含めることができます。唯一の要件は、<item>要素または 要素を<description>子として少なくとも<title>含むということです。 ドイツ<item>語の子要素の一覧を次に示します。

  • title—ニュースアイテムのタイトル
  • link—ニュースアイテムの URL
  • description—ニュースアイテムの簡単な概要
  • author—ニュースアイテムの作成者、および
  • pubDate—ニュースアイテムの公開日。

次に、非常に単純な RSS 2.0 配信ファイルを示します。 Radio UserLand によって生成された RSS から RSS 2.0 ファイルの別の例を確認できます。

<rss version="2.0">
  <channel>
    <title>Latest DataWebControls.com FAQs</title>
    <link>http://datawebcontrols.com</link>
    <description>
        This is the syndication feed for the FAQs 
        at DataWebControls.com
    </description>
    <item>
      <title>Working with the DataGrid</title>
      <link>http://datawebcontrols.com/faqs/DataGrid.aspx</link>
      <pubDate>Mon, 07 Jul 2003 21:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Working with the Repeater</title>
      <description>
         This article examines how to work with the Repeater 
         control.
      </description>
      <link>http://datawebcontrols.com/faqs/Repeater.aspx</link>
      <pubDate>Tue 08 Jul 2003 12:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>

ここで注意すべき重要な点の 1 つは、 <pubDate> 要素の書式設定です。 RSS では、日付を RFC 822 の 日付と時刻の仕様に従って書式設定する必要があります。これは、省略可能な 3 文字の日の省略形とコンマで始まり、その後に必要な日、3 文字の省略された月、年、タイム ゾーン名を持つ時刻で始まります。 また、item> 要素の<description><子要素は省略可能であることにも注意してください。最初のニュース アイテムには要素がありません<description>が、2 番目のニュース アイテムには要素があります。

ASP.NET Web ページを使用した配信出力の作成

RSS 2.0 仕様と共にニュースアイテムがどのように保存されるかを確認したので、要求されたら Web サイトの配信コンテンツを返す ASP.NET Web ページを作成する準備ができました。 具体的には、RSS 2.0 仕様に従って書式設定された、データベース テーブルからArticles最新の 5 つのニュースアイテムを返す という名前rss.aspxの ASP.NET Web ページを作成します。

これを実現するには、いくつかの方法があります。これについては、後で説明します。 ただし、最初に、データベースから最新の 5 つのニュースアイテムを取得する必要があります。 これは、次の SQL クエリを使用して実行できます。

  SELECT TOP 5 ArticleID, Title, Author, Description, DatePublished
  FROM Articles
  ORDER BY DatePublished DESC

この情報を取得したら、適切な RSS 2.0 配信ファイルにレンダリングする必要があります。 データベース データを XML データとして表示する最も簡単で最も簡単な方法は、Repeater コントロールを使用することです。 具体的には、Repeater によって、Web サイトに関連する要素タグと テンプレート内のFooterTemplate要素、および テンプレート内の要素がItemTemplate<item>表示されます <rss> <channel>HeaderTemplate ASP.NET Web ページ (ファイル) の HTML 部分を次に.aspx示します。

  <%@ Page language="c#" ContentType="text/xml" Codebehind="rss.aspx.cs"
    AutoEventWireup="false" Inherits="SyndicationDemo.rss" %>
  <asp:Repeater id="rptRSS" runat="server">
    <HeaderTemplate>
      <rss version="2.0">
        <channel>
          <title>ASP.NET News!</title>
          <link>http://www.ASPNETNews.com/Headlines/</link>
          <description>
            This is the syndication feed for ASPNETNews.com.
          </description>
    </HeaderTemplate>

    <ItemTemplate>
          <item>
            <title><%# FormatForXML(DataBinder.Eval(Container.DataItem,
                                                "Title")) %></title>
            <description>
              <%# FormatForXML(DataBinder.Eval(Container.DataItem, 
                                      "Description")) %>
            </description>
            <link>
              http://www.ASPNETNews.com/Story.aspx?ID=<%# 
                    DataBinder.Eval(Container.DataItem, "ArticleID") %>
            </link>
            <author><%# FormatForXML(DataBinder.Eval(Container.DataItem, 
                                              "Author")) %></author>
            <pubDate>
              <%# String.Format("{0:R}", 
                    DataBinder.Eval(Container.DataItem, 
                                          "DatePublished")) %>
            </pubDate>
          </item>
    </ItemTemplate>

    <FooterTemplate>
        </channel>
      </rss>  
    </FooterTemplate>
  </asp:Repeater>

最初に注意すべき点は、上記のコード例には Repeater コントロールのみが含まれており、他の HTML マークアップや Web コントロールは含まれないということです。 これは、このページで XML 出力以外の出力を行う必要があるためです。 実際、 ディレクティブを@Page見ると、 が XML MIME の種類 (text/xml) に設定されていることがわかりますContentType。 次にItemTemplate、 と のデータベース フィールドを Description TitleAuthor XML 出力に追加するときに、ヘルパー関数 FormatForXML()を呼び出します。 この関数は分離コード クラスで定義されています。これについては簡単に説明します。不正な XML 文字は、エスケープされた有効な同等の文字に置き換えるだけです。 最後に、DatePublished要素に<pubDate>入力されたデータベース フィールドは、 メソッドを使用してString.Format()適切に書式設定されます。 標準書式指定子Rは、値の書式をDatePublished適切に設定します。

この Web ページの分離コード クラスは、かなり簡単です。 イベント ハンドラーはPage_Load単にデータベース クエリを Repeater にバインドしますFormatForXML()が、関数は必要に応じていくつかの単純な文字列置換を行います。 簡潔にするために、分離コード クラスからはイベント ハンドラーとFormatForXML()関数のみがPage_Load表示されます。

private void Page_Load(object sender, System.EventArgs e)
{
   // Connect to the Database
   SqlConnection myConnection = new SqlConnection(connection string);
   
   // Retrieve the SQL query results and bind it to the Repeater
   string SQL_QUERY = "SELECT TOP 5 ArticleID, Title, Author, " +
                          "Description, DatePublished " +
                      "FROM Articles ORDER BY DatePublished DESC";
   SqlCommand myCommand = new SqlCommand(SQL_QUERY, myConnection);

   // bind the results to the Repeater
   myConnection.Open();
   rptRSS.DataSource = myCommand.ExecuteReader();
   rptRSS.DataBind();
   myConnection.Close();
}


protected string FormatForXML(object input)
{
   string data = input.ToString();      // cast the input to a string

   // replace those characters disallowed in XML documents
   data = data.Replace("&", "&amp;");
   data = data.Replace("\"", "&quot;");
   data = data.Replace("'", "&apos;");
   data = data.Replace("<", "&lt;");
   data = data.Replace(">", "&gt;");

   return data;
}

ブラウザーで表示される のスクリーンショット rss.aspxは、 図 1 に示されています。

Aa478968.aspnet-createrssw-aspnet01(en-us,MSDN.10).gif

図 1. Rss.aspx(ブラウザーを使用して表示する場合)

オンライン ニュース アグリゲーターの構築に進む前に、配信エンジンに対して可能な機能強化をいくつかメンションしましょう。 まず、Web ページがrss.aspx要求されるたびに、データベース アクセスが行われます。 多数のユーザーが頻繁にアクセスすることが rss.aspx予想される場合は、出力キャッシュを使用する価値があります。 第 2 に、通常、ニュース サイトは配信をさまざまなカテゴリに分割します。 たとえば、News.com には、Enterprise Computing、E-Business、Communications などに焦点を当てたコンテンツなど、特殊な配信セクションがあります。 テーブルに何らかのCategoryフィールドがある場合は、このようなサポートを簡単にArticles実行できます。 Web ページではrss.aspx、表示するカテゴリを示す querystring パラメーターを受け取り、指定したカテゴリのニュース アイテムのみを取得できます。

ASP.NET Web ページでの配信フィードの使用

先ほど作成した配信エンジンをテストするために、任意の数の配信フィードを許可するオンライン ニュース アグリゲーターを構築しましょう。 アグリゲーターのユーザー インターフェイスは、 図 2 に示すように、3 つのフレームで構成される非常に簡単です。 左側のフレームには、さまざまな配信フィードの一覧が表示されます。 右上のフレームに、選択した配信フィードのニュース項目が表示されます。 最後に、右下のフレームに、選択したニュースアイテムフィードのタイトルと説明が表示され、ニュースアイテムへのリンクが表示されます。 この UI は、ニュース アグリゲーター、メール クライアント、ニュース グループリーダーなど、あらゆる種類のアグリゲーターの事実上の標準 UI であることに注意してください。

Aa478968.aspnet-createrssw-aspnet02(en-us,MSDN.10).gif

図 2. ニュース アグリゲーターのユーザー インターフェイスのスクリーンショット

最初の手順では、フレーム化されたユーザー インターフェイスを設定する HTML Web ページを作成します。 幸いにも、Visual Studio .NET 2003 では、このプロセスが非常に簡単になります。単に[Web アプリケーション ソリューションに新しい項目を追加する] を選択し、新しい項目の種類を Frameset に選択します。 (プロジェクトでこの新しいファイルNewsAggregator.htmに名前を付けました。このページには、Web ページ内の 3 つのフレームを設定するための HTML だけが含まれるため、これを ASP.NET Web ページにするのではなく、HTML ファイルとして残しました。各フレームには、実際の ASP.NET Web ページが表示されます)。これにより、 図 3 に示す Frameset テンプレート ウィザードが起動します。 [入れ子になった階層] オプションを選択し、[OK] をクリックするだけです。

Aa478968.aspnet-createrssw-aspnet03(en-us,MSDN.10).gif

図 3: Visual Studio .NET 2003 のフレームセット ウィザード

フレームセット テンプレート ウィザードによって、フレーム ソースが既に追加された HTML Web ページが作成されます。 フレームの属性をsrc DisplayFeeds.aspx配信フィードのleft一覧を表示する ASP.NET Web ページの URL に設定するだけです。 これはページ用NewsAggreator.htmです。

次の 3 つのセクションでは、オンライン ニュース アグリゲーター DisplayFeeds.aspxの 3 つのコンポーネントの作成について説明します。これは配信フィード DisplayNewsItems.aspxの一覧を表示します。これは、特定の配信フィードのニュースアイテムを表示します。また DisplayItem.aspx、特定の配信フィードの特定のニュースアイテムの詳細を表示します。

配信フィードの一覧の表示

ここで、ASP.NET Web ページをDisplayFeeds.aspx作成する必要があります。 この Web ページには、サブスクライブしているフィードの一覧が表示されます。 このデモでは、フィードの一覧を という Feedsデータベース テーブルに配置することにしました。ただし、フィードは XML ファイルにも格納できます。 テーブルにはFeeds、次の 4 つのフィールドが含まれています。

  • FeedID—各フィードを一意に識別するために使用される自動インクリメントされた整数主キー フィールド
  • Title varchar(50)—フィードの名前を格納する 。
  • URL varchar(150)RSS 配信フィードの URL を格納する 。
  • UpdateInterval - フィードを更新する頻度を分単位で指定する整数フィールド。

Web ページではDisplayFeeds.aspx、DataGrid を使用して配信フィードの一覧を表示します。 DataGrid には 1 つの HyperLinkColumn 列があり、フィールドのTitle値が表示され、ページ DisplayNewsItems.aspxへのリンクが表示され、querystring のフィールド値に沿ってFeedID渡されます。 簡潔にするためにいくつかの周辺機器マークアップを省略した DataGrid 宣言を次に示します。

<asp:DataGrid id="dgFeeds" runat="server" 
             AutoGenerateColumns="False" ...>
   ...
   <Columns>
     <asp:HyperLinkColumn Target="rtop" 
         DataNavigateUrlField="FeedID" 
         DataNavigateUrlFormatString="DisplayNewsItems.aspx?FeedID={0}"
         DataTextField="Title" HeaderText="RSS Feeds">
     </asp:HyperLinkColumn>
   </Columns>
</asp:DataGrid>

観察する重要な点は、HyperLinkColumn です。 そのTargetプロパティは、ユーザーが配信フィード URL をクリックすると、DisplayNewsItems.aspxWeb ページが右上のフレームで開くように設定されていることに注意してください。 また、DataNavigateUrlField、DataNavigateUrlFormatString、および DataTextField プロパティが設定され、ハイパーリンクに配信フィードのタイトルが表示され、クリックされると、ユーザーはクエリ文字列内のフィールドのFeedID値に DisplayNewsItems.aspx沿って渡されます。 (このページの分離コード クラスは、フィールド テーブルのTitleアルファベット順に並べられたテーブルからFeedsフィードの一覧にアクセスし、結果を DataGrid にバインドするだけです。スペースに関する考慮事項については、このコードは、この記事のテキストには記載されていません)。

特定の配信フィードのニュース項目の表示

次に直面するタスクは、Web ページのDisplayNewsItems.aspx作成です。 このページには、選択した配信フィードのニュース アイテムのタイトルがハイパーリンクとして表示されます。ハイパーリンクをクリックすると、ニュース アイテムの説明が右下フレームに表示されます。 このタスクでは、次の 2 つの主な課題を示します。

  • フィードの指定した URL から RSS 配信フィードにアクセスする
  • 受信した XML を適切な HTML に変換する。

幸いにも.NET Framework、これら2つの課題のどちらも特に困難ではありません。 最初のタスクでは、リモート XML データを 2 行のコードだけでオブジェクトに読み込XmlDocumentむことができることを認識します。 2 番目のタスクでは、ASP.NET Web ページに XML を表示することは、ASP.NET XML Web コントロールを持つ cinch です。

XML Web コントロールは、生または変換された XML データを Web ページに表示するように設計されています。 XML Web コントロールを使用する最初の手順は、XML データ ソースを指定することです。 これは、3 つの異なるプロパティを使用して、さまざまな方法で実現できます。 Document プロパティを使用すると、XML Web コントロールの XML データ ソースとしてインスタンスを割り当てることができますXmlDocument。 XML データが Web サーバーのファイル システム上のファイルに存在する場合は、 プロパティをDocumentSource使用して、XML ファイルへの相対パスまたは絶対パスを指定できます。 最後に、文字列に XML データがある場合は、この文字列を XML Web コントロールのDocumentContentプロパティに設定できます。 これら 3 つの方法のいずれかを使用して、XML データを XML Web コントロールに関連付けることができます。

通常は、WEB ページに表示する前に、何らかの方法で XML データを変換する必要があります。 XML Web コントロールを使用すると、変換を適用する XSLT スタイルシートを指定できます。 XML データと同様に、XSLT スタイルシートは、2 つのプロパティTransformのいずれかを使用して 2 つの方法のいずれかで指定できます。プロパティをインスタンスTransformSourceXslTransform割り当てることも、プロパティをローカル Web サーバー上の XSLT スタイルシートの相対パスまたは絶対ファイル パスに設定することもできます。 しばらくすると、実際の XML Web コントロールの例が表示されます。

Web ページの作成に取り DisplayNewsItems.aspx 組みましょう。 XML Web コントロールを追加し、分離コード クラスの作成を開始する前に、クライアント側 JavaScript の小さなビットを HTML 部分に追加する必要があります。 具体的には、HTML 部分の タグに<head><script>のブロックを追加します。

<script language="javascript">
  // display a blank page in the bottom frame when the news items loads
  parent.rbottom.location.href = "about:blank";
</script>

このクライアント側の JavaScript では、読み込まれるたびにDisplayNewsItems.aspx右下フレームに空白のページが表示されます。 これを行う理由を理解するために、このブロックを省略した場合に展開できる次の状況を<script>検討してください。

  1. ユーザーが左フレームから配信フィードをクリックすると、フィードのニュース項目が右上のフレームに読み込まれます。
  2. その後、ユーザーは右上のフレームからニュース アイテムの 1 つをクリックし、右下フレームにニュース アイテムの詳細を読み込みます。
  3. これで、ユーザーは左フレームから別の配信フィードをクリックして、右上のフレームに新しいフィードのニュースアイテムを読み込みます。

この時点で、前の配信フィードのニュースアイテムの詳細は右下フレームに残っています。 上記のクライアント側スクリプト コードは、左フレームからの配信フィードがクリックされるたびに右下フレームの内容を "ホイップアウト" することで、この不具合を軽減します。

クライアント側のスクリプトの問題に対処したので、必要な XML Web コントロールを追加することに注目しましょう。 XML Web コントロールを追加したら、そのIDプロパティを にxsltNewsItems設定し、そのTransformSourceプロパティを にNewsItems.xslt設定します (次に作成する XSLT スタイルシートの名前)。 次にPage_Load、イベント ハンドラーで、インスタンス内のリモート RSS 配信ファイルをXmlDocument取得し、XML Web コントロールのDocumentプロパティをこのXmlDocumentインスタンスに設定する必要があります。

  private void Page_Load(object sender, System.EventArgs e)
  {
    // See if the news items for this feed are in the Data Cache
    int feedID = Int32.Parse(Request.QueryString["FeedID"]);

    // Connect to the Database to find out the URL to the RSS
    SqlConnection myConnection = new SqlConnection(connection string);
    
    // Retrieve the SQL URL for the Remote RSS syndication file
    string SQL_QUERY = "SELECT URL, UpdateInterval FROM Feeds " +
                        "WHERE FeedID = @FeedID";
    SqlCommand myCommand = new SqlCommand(SQL_QUERY, myConnection);

    SqlParameter feedParam = new SqlParameter("@FeedID", 
                                            SqlDbType.Int, 4);
    feedParam.Value = feedID;
    myCommand.Parameters.Add(feedParam);

    myConnection.Open();
    string feedURL = myCommand.ExecuteScalar().ToString()
    myConnection.Close();

    // Now that we have the feed URL, load it in into an XML document
    XmlDocument feedXML = new XmlDocument();
    feedXML.Load(feedURL);

    xmlNewsItems.Document = feedXML;
  }

イベント ハンドラー内の最もドイツ語的なPage_Loadコード行は、最後の 3 行です。 この 3 行のコードでは、新しいXmlDocumentオブジェクトを作成し、リモート RSS フィードに読み込み、オブジェクトをXmlDocumentXML Web コントロールのDocumentプロパティに割り当てます。 リモート XML データにアクセスし、ASP.NET Web ページに表示するのがいかに簡単であるかは印象的ではありませんか?

ここで残しておいたのは、XSLT スタイルシート NewsItems.aspxの作成です。 このスタイルシートの最初の下書きを次に示します。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" omit-xml-declaration="yes" />

   <xsl:template match="/rss/channel">
      <b><xsl:value-of select="title" 
                   disable-output-escaping="yes" /></b>
      <xsl:for-each select="item">
         <li>
            <a>
               <xsl:attribute name="href">
                  DisplayItem.aspx?ID=<xsl:number value="position()" />
   </xsl:attribute>
               <xsl:attribute name="target">rbottom</xsl:attribute>
               <xsl:value-of select="title"
                       disable-output-escaping="yes"  />
            </a>
            (<xsl:value-of select="pubDate" />)
         </li>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

この XSLT スタイルシートには、XPath 式に/rss/channel一致するテンプレートが 1 つあり、要素の値が<title>太字で出力されます。 次に、各要素を<item>反復処理し、それぞれに対して へのハイパーリンク DisplayItem.aspxを表示し、クエリ文字列を<item>介して要素の位置を渡します。 このハイパーリンクのターゲット属性も、右下フレームの名前に rbottom設定されていることに注意してください。 最後に、各ニュース アイテムのタイトルの後に<pubDate>要素の値が表示されます。

XSLT スタイルシートには、誰もが慣れているとは言えない項目がいくつかあります。 これらの 1 つ目は、disable-output-escaping="yes"要素の<xsl:value-of>属性です。 基本的に、この属性設定は、無効な XML 文字 、& "< >および ' をエスケープしてはならないことを XSLT エンジンに通知します。 これが何を実現するのかを理解するために、この属性が設定されていない (または既定値 "no"に設定されている) 場合、タイトルに としてエスケープされた &amp;& が含まれている場合、結果の HTML&amp;も同じように &含まれることに気付きます。 これについて少し考えるならば、これは多くの問題を引き起こす可能性があることがわかります。 たとえば、配信ファイルのタイトルが: "Matt's &lt;i&gt;Cool&lt;/i&gt; Blog" の場合、出力エスケープが無効でない場合、出力は残り"Matt's &lt;i&gt;Cool&lt;/i&gt; Blog"、Web ページに として "Matt's <i>Cool</i> Blog"表示されます。 ただし、 を使用すると disable-output-escaping="yes"、出力はエスケープされず、として "Matt's <i>Cool</i> Blog"読み取られ、Web ページに必要に応 "Matt's Cool Blog"じて表示されます。

もう 1 つ注意すべき点は、<a>要素です。 このファンキーな構文が最終的に次の出力を生成することに気付きます。

<a href="DisplayItem.aspx?ID=position">news item title</a>

この構文を使用する必要があるのは、XSLT スタイルシート内の要素に属性を追加するには、 要素を作成してから、要素のタグ内で 構文を使用する<xsl:attribute>必要があるためです。 この構文の例は、オンラインで W3Schools の <xsl:attribute> Element ページで使用できます。

最後に、ハイパーリンク内のIDquerystring 値には、 関数の値を持つ 要素からの<xsl:number>値がposition()割り当てられていることに注意してください。 要素は<xsl:number>単に数値を出力します。 関数はposition()、XML ドキュメント内の現在のノードの序数位置を返す XPath 関数です。 つまり、最初のニュース アイテムの値はposition()1、2 番目position()は 2、次のようになります。 この値を記録し、クエリ文字列を使用して渡す必要があります。これにより、Web ページが呼び出されたときにDisplayItem.aspx、表示する RSS 配信フィードの項目が認識されます。

astute リーダーは、パラメーターがクエリ文字列を介して Web ページに渡されないというFeedID事実により、XSLT スタイルシートが完全ではないことにDisplayItem.aspx気付いた可能性があります。 これが問題である理由を確認するには、ユーザーが詳細の表示にID関心がある要素の<item>序数位置を querystring パラメーターで送信していることを思い出してください。 つまり、ユーザーが 4 番目のニュース アイテムをクリックすると、ページDisplayItem.aspx?ID=4は右下フレームに読み込まれます。 問題は、ユーザーがDisplayItem.aspx表示に関心のあるフィードを特定できないことです。 右下フレームでクライアント側の JavaScript を使用して右上フレームの URL を読み取り、 の値 FeedIDを確認するなど、これを把握するにはいくつかの方法があります。 私の意見では、より簡単な方法は、単にパラメーターとID共にクエリ文字列をFeedID通して値に沿って渡すことです。

この問題から生じる 1 つの難しさはFeedID、RSS XML データに存在しないことです。これは、XSLT スタイルシートが操作しているものです。 ただし、Web ページはDisplayNewsItems.aspx FeedID認識し、XSLT スタイルシートにこの値を知らせる必要があります。 これは、XSLT パラメーターを使用して実現できます。

XSLT パラメーターの使用は非常に簡単です。 XSLT スタイルシートでは、xsl:template 要素内<に xsl:param> 要素を<追加する必要があります。これは、 パラメーターの名前を提供>します。 このパラメーター FeedID を呼び出してみましょう。

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:template match="/rss/channel">
      <xsl:param name="FeedID" />

                ...
   </xsl:template>
</xsl:stylesheet>

ここで、 パラメーターは、次の構文を <使用して xsl:value-of> 要素で使用できます。

<xsl:value-of select="$parameterName" />

したがって、既存の XSLT スタイルシートに次を追加することで、FeedID querystring パラメーターをハイパーリンクに追加できます。

<a>
  <xsl:attribute name="href">DisplayItem.aspx?ID=<xsl:number 
    value="position()" />&amp;FeedID=<xsl:value-of select="$FeedID" 
      /></xsl:attribute>

querystring パラメーターの後ID &amp;アンパサンド (エスケープ後) があり、 パラメーターのFeedID値を持つ querystring パラメーターFeedIDがあることに注意してください。 XSLT スタイルシートに追加する必要があるのはこれで済みます。

残っているのは、Web ページのイベント ハンドラーでパラメーターのDisplayNewsItems.aspx値をPage_Loadプログラムで設定することです。 これは、 クラスを使用して実現されますXsltArgumentList。 このクラスには メソッドがAddParameter()含まれています。 このクラスのインスタンスを作成し、 パラメーターを追加したら、クラス インスタンスを XML Web コントロールのTransformArgumentListパラメーターに設定するだけです。 次のコードは、DisplayNewsItems.aspx の更新されたPage_Load イベント ハンドラーを示しています。

private void Page_Load(object sender, System.EventArgs e)
{
        ...

   // Now that we have the feed URL, load it in into an XML document
   XmlDocument feedXML = new XmlDocument();
   feedXML.Load(feedURL);

   xmlNewsItems.Document = feedXML;

   // Add the FeedID parameter to the XSLT stylesheet
   XsltArgumentList xsltArgList = new XsltArgumentList();
   xsltArgList.AddParam("FeedID", "", feedID);
   xmlNewsItems.TransformArgumentList = xsltArgList;
}

特定のニュース アイテムの詳細の表示

残っているのは、ユーザーが選択した特定のニュースアイテムの詳細情報を表示することです。 この詳細情報は右下のフレームに表示され、ニュース アイテムエントリのタイトル、その説明、およびニュースアイテムへのリンクが表示されます。 Web ページと同様に DisplayNewsItem.aspx 、まず、 DisplayItem.aspx 渡された FeedID querystring パラメーターに基づいてリモート RSS 配信フィードを取得します。 その後、XML Web コントロールを使用して詳細情報を表示します。 実際、Web ページのPage_Loadイベント ハンドラーDisplayItem.aspxは、2 つの小さな違いについて、Web ページのPage_Loadイベント ハンドラーの保存と同じですDisplayNewsItem.aspx

  • DisplayItem.aspx querystring パラメーターの ID 値を読み取る必要があります。
  • DisplayItem.aspx は XSLT パラメーターを使用しますが、 とは異なります DisplayNewsItem.aspx

DisplayNewsItem.aspxDisplayItem.aspx同様に、 パラメーターを XSLT スタイルシートに渡す必要があります。 に対して querystring パラメーター DisplayItem.aspxFeedIDで渡されるのに対DisplayNewsItem.aspxし、XSLT スタイルシートがID表示するニュースアイテムを示す querystring パラメーターを渡す必要があります。 これらの軽微な変更は、次のPage_Loadイベント ハンドラーに太字フォントで示されています。イベント ハンドラーDisplayNewsItems.aspxPage_Load同じコードは省略されています。

  private void Page_Load(object sender, System.EventArgs e)
  {
    // See if the news items for this feed are in the Data Cache
    int feedID = Int32.Parse(Request.QueryString["FeedID"]);
    int ID = Int32.Parse(Request.QueryString["ID"]);

    ...

    // Now that we have the feed URL, load it in into an XML document
    XmlDocument feedXML = new XmlDocument();
    feedXML.Load(feedURL);

    xmlNewsItems.Document = feedXML;

    this.xmlItem.Document = feedXML;

    // Add the ID parameter to the XSLT stylesheet
    XsltArgumentList xsltArgList = new XsltArgumentList();
    xsltArgList.AddParam("ID", "", ID);
    xmlItem.TransformArgumentList = xsltArgList;
  }

XML データを変換するための XSLT スタイルシートを次に示します。

  <?xml version="1.0" encoding="UTF-8" ?>
  <xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" />
    <xsl:param name="ID" />

    <xsl:template match="/rss/channel">
        <b><xsl:value-of select="item[$ID]/title" 
                            disable-output-escaping="yes" /></b>
        <p>
          <xsl:value-of select="item[$ID]/description" 
                            disable-output-escaping="yes" />
        </p>
        <a>
          <xsl:attribute name="href"><xsl:value-of 
            select="item[$ID]/link" /></xsl:attribute>
          <xsl:attribute name="target">_blank</xsl:attribute>
          Read More...
        </a>
    </xsl:template>
  </xsl:stylesheet>

XSLT パラメーターを<xsl:param>宣言するには、 要素が ID 使用されることに注意してください。 次に、さまざまな<xsl:value-of>要素で、 パラメーターをID使用して、要素の一覧から特定<item><item>要素だけを取得します。 XPath では、構文elementName[i]が適切な要素名を持つ I番目の要素だけにアクセスすることを認識します。 たとえば、item[1]最初<item>の要素だけを取得しますitem[2]が、2 番目の要素のみを取得します。 したがって、item[$ID]XSLT パラメーターで<item>ID指定された要素のみを取得します。

最後に、続きを読む... XSLT スタイルシートの末尾付近に出力されるハイパーリンクの属性がtarget blank設定されているため、ユーザーが [読み取り] をクリックしたときに新しいウィンドウが開きます。 。

今後の機能強化と現在の欠点

この記事で調べたコードの欠点の 1 つは、ユーザーが左フレームから配信フィードをクリックするたびに、または右上のフレームからニュース アイテムのタイトルをクリックするたびに、リモート RSS 配信フィードが読み込まれて解析されるということです。 配信フィードをクリックするとすべての項目が読み込まれるので、これは明らかに非効率的です。ユーザーがフィードのニュースアイテムタイトルのいずれかをクリックするたびに、リモート配信フィード全体を再読み込みするのは無駄です。 このアプローチは非効率的であるだけでなく、配信サービスを提供する人や会社に対して不正確です。これらの絶え間ない不必要な要求によって、Web サーバーに不要な負荷がかかっています。

この欠点は、この記事でダウンロードできるソース コードで克服されています。 具体的には、.NET データ キャッシュを使用して、さまざまなフィードのXmlDocumentオブジェクトを格納します。 キャッシュ期間は、テーブル内のフィードのフィールドのUpdateInterval値に設定されますFeeds。 (もちろん、フィードのXmlDocumentオブジェクトは、さまざまな理由で、以前の時点でキャッシュから削除される可能性があります)。

システムのもう 1 つの欠点は、右上フレームと右下フレームの間に状態が存在しないということです。 これが問題につながる可能性がある場所を確認するには、次のアクションを検討します。

  1. ユーザーが左フレームから配信フィード リンクをクリックし、フィードのニュースアイテムを右上のフレームに読み込みます。 この配信の値がUpdateInterval30 であると仮定します。つまり、有効期限は 30 分です。
  2. 右上のフレームにニュースアイテムを読み込むと、フィードはデータ キャッシュにキャッシュされます。
  3. ユーザーは昼食のために出発します。
  4. 配信サービスを提供する Web サイトによって、新しいニュース アイテムが追加されます。
  5. ユーザーは 1 時間のランチから戻ります。つまりXmlDocument、データ キャッシュ内のこのフィードの 有効期限が切れています。
  6. ユーザーは、右上のフレームから最初のニュース アイテムをクリックします。 これは、パラメーター値 1 を渡して、下部フレームにID読み込まれますDisplayItem.aspx
  7. DisplayItem.aspx はキャッシュ内に がXmlDocument見つからないため、リモート ソースから配信フィードを要求します。 応答として、 新しい 配信フィードを取得し (手順 4 で新しいニュース アイテムが追加されたことを覚えておいてください)、最初の項目を表示します (パラメーターが ID 1 であるため)。
  8. ユーザーには新しいニュースアイテムが表示されます。これは、新しいニュースアイテムが右上のフレームに表示されず、クリックしたと思ったものではありませんでした。

この問題は、パラメーターが各ニュースアイテムをID一意に識別するものではなく、特定の時点でのニュースアイテムのリストからのニュースアイテムのオフセットに過ぎないために発生します。 これを修正する良い方法は、データ キャッシュを使用して各配信フィードを格納するのを停止し、データベースまたはその他の永続ストレージ (Web サーバーのローカル ファイル システム上の XML ファイルなど) の使用を開始することです。 データベースを使用すると、各ニュース アイテムに一意の識別子を指定し、右下フレームに渡すことができます。 このアプローチは、上記の問題に対して保証されます。 もちろん、これにより、データベースから古い項目をクリアするタイミングを決定するなど、複雑さが増します。

既存のアプリケーションにも例外処理がありません。 これは間違いなく追加する必要があります。 特に、リモート RSS 配信ファイルを取得してオブジェクトに読み込むには、例外処理を追加するXmlDocument必要があります。 ファイルが存在しないか、形式が正しくない可能性があります。

このオンライン ニュース アグリゲーターに簡単に追加できる多数の機能強化があります。 明らかな 1 つは、ユーザーが既存の配信フィードを追加、削除、編集できるようにする管理ページです。 また、ユーザーが作成したカテゴリ別に配信フィードをグループ化できるようにすると便利です。 ユーザー インターフェイスは目には少し難しいですが、XSLT スタイルシートによって生成された HTML を拡張するか、さまざまなフレームにスタイルシートを追加して、より美しい外観を実現することで、これをすぐに修正できます。 最後に、HTML タグを<meta>追加して右上のフレームを定期的に更新し、ユーザーが Web ページを手動で更新しなくても特定の配信フィードの新しいニュースアイテムを表示できるようにすることをお勧めします。

注 (2003 年 8 月 4 日):この記事を公開した後、数人の人々が私に、記事に表示する方法で特定のRSS配信アイテムの説明>を表示する<際の2つの潜在的な問題を私に知らせる電子メールを送った:

1. xsl:value-of> で<使用される Disable-output-encoding は、すべての XSLT パーサーによって一様に実装されるわけではありません。  .NET XSLT パーサーでは disable-output-encoding がサポートされていますが、このアプリケーションを他のプラットフォームに移植しようとする場合は、この点に注意してください。

2. description> 要素内の <HTML コンテンツは、盲目的に出力されます。  この HTML には、スクリプト>や<埋め込み>ブロックなどの<悪意のあるコードが含まれている可能性があり、理想的には削除する必要があります。これらの不快な HTML 要素を取り除くには、拡張関数を使用する必要がある可能性があります (「JScript、C#、Visual Basic .NET を使用した XSLT の拡張」を参照)。 RSS フィードから HTML コンテンツを削除する必要性の詳細については、こちらのブログ エントリ「Dive Into Mark」を参照してください。

まとめ

この記事では、配信エンジンだけでなく、オンライン ニュース アグリゲーターの構築についても説明しました。 両方の製品を構築する際に、ASP.NET Web ページに XML データを表示する作業を行いました。 配信エンジンでは、Repeater コントロールを使用して XML 形式でデータベース データを表示しました。 ニュース アグリゲーターでは、XSLT スタイルシートで XML Web コントロールを使用しました。

オンライン ニュース アグリゲーターをダウンロードして、必要に応じて拡張機能を作成するようお勧めしています。 アプリケーションやこの記事で説明されている概念に関して質問がある場合は、私にメールを撮影することを躊躇しないでください。私はで mitchell@4guysfromrolla.com到達することができます.

幸せなプログラミング!

著者について

5 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、過去 5 年間 Microsoft Web テクノロジと協力してきました。 ASP および ASP.NET コミュニティのアクティブメンバーである Scott は、ASP と ASP.NET に情熱を注いでいて、他のユーザーがこれらのエキサイティングなテクノロジについてさらに学ぶのを楽しんでいます。 DataGrid、DataList、および Repeater コントロールの詳細については、Scott の最新の書籍「ASP.NET Data Web Controls Kick Start (ISBN: 0672325012)」をチェック。

© Microsoft Corporation. All rights reserved.