XMLとRSS 第3回

簡易RSSビューアは前回出来上がりましたが、これを今後本格的なアプリケーション「RSSリーダ」に発展させるためにはどうすればよいでしょうか。今回はRSSリーダの作成をテーマにXMLの関連技術をいくつか紹介して連載を締めくくりたいと思います。

まずRSSリーダの作成にあたってはデスクトップアプリケーションかウェブアプリケーションかという選択がありますがこれはウェブアプリケーションのほうが面白いでしょう。デスクトップアプリケーションに比べて次のような利点があります。

  • 会社と自宅など読む場所が変わっても同じ設定・状態で使える。
  • 同じRSSリーダを使用している別のユーザと情報を共有できる。

「1」については一般的なウェブアプリケーションの特長といえますが、「2」はアプリケーションの特性によるものです。例えばどんなサイトが多くの人に注目(登録)されているのかというのは単純に興味深い情報です。また「このフィードを登録している人はこんなフィードも登録しています」といった表示を行うこともできるでしょう。登録をする際に関連するキーワードをタグとして付加(XMLのタグとは別です)することで分類を行い、これを他のユーザと共有することもできます。

これらはユーザ情報をサーバで一元管理することで生まれる利点です。サーバでデータを効率よく管理するためにはデータベースが用いられます。現在一般的に使用されているのはRDBMS(リレーショナルデータベース管理システム)でこれはデータを2次元の表として管理します。多くの用途で適合しますが、例えばツリー構造のように表では難しいがXMLなら上手く表現できるというデータの管理には向いていません。

XMLデータベースと呼ばれる製品はXMLをそのまま格納します。RDBではデータの検索にSQLを使用しますが、XMLデータベースではXQueryという言語を使用します。XQueryはW3Cで検討されていますが現在は勧告候補です。勧告までにはもう少し時間がかかるかも知れません。XMLデータベース製品は商用製品の他にオープンソースで開発されているものもあります。オープンソースでは eXist(http://exist.sourceforge.net/)の活動が活発なようです。

今回は「NeoCoreEX」を使用してXQueryを試してみたいと思います。

RSSリーダアプリケーションを考えた場合にまずデータベースへの格納対象となるのはRSSです。購読しているユーザが多い場合でも一度サーバで取得したRSSをそれぞれのユーザが参照すればよいので購読先サイトの負荷を軽減することができます。ユーザの購読リストはOPMLで管理することにします。OPMLはOutline Processor Markup Languageの略で仕様はhttp://www.opml.orgで公開されています。RSSリーダ間で購読リストをやり取りする形式としてOPMLが利用されるようになっています。

次のような購読リストをサンプルとして準備します。

john_opml.xml
<?xml version="1.0" encoding="utf-8"?>
<opml version="1.0">
  <head>
    <title>ジョンの購読リスト</title>
    <ownerName>John Doe</ownerName>
  </head>
  <body>
    <outline
      title="animal - Everyone's Tagged Photos"
      type="rss"
      htmlUrl="http://www.flickr.com/photos/tags/animal/"
      xmlUrl="http://www.flickr.com/services/feeds/photos_public.gne?tags=
animal&format=rss_100"
    />
    <outline
      title="YouTube :: Most Discussed Videos - Today"
      type="rss"
      htmlUrl="http://youtube.com/rss/global/most_discussed_today.rss"
      xmlUrl="http://youtube.com/rss/global/most_discussed_today.rss"
    />
  </body>
</opml>
jane_opml.xml
<?xml version="1.0" encoding="utf-8"?>
<opml version="1.0">
  <head>
    <title>ジェーンの購読リスト</title>
    <ownerName>Jane Doe</ownerName>
  </head>
  <body>
    <outline
      title="YouTube :: Most Discussed Videos - Today"
      type="rss"
      htmlUrl="http://youtube.com/rss/global/most_discussed_today.rss"
      xmlUrl="http://youtube.com/rss/global/most_discussed_today.rss"
    />
    <outline
      title="CNN.com"
      type="rss"
      htmlUrl="http://www.cnn.com/rssclick/?section=cnn_topstories"
      xmlUrl="http://rss.cnn.com/rss/cnn_topstories.rss"
    />
  </body>
</opml>

「NeoCoreEX」の管理ツールDXE Managerを立ち上げlocalhostに接続します。localhostの下のxlndefaultを右クリックし「XMLStoreの作成」を選択します。作成されたXMLStoreに「RSS Reader」という名前を付けます。「RSS Reader」をクリックして選択状態にしたら右側のペインに購読リストOPMLファイルをドラッグアンドドロップします。ドロップしたときに表示されるメニューでは「空白文字を保存(P)」を選びます。

「XMLStoreの作成」
※現在はNeoCoreシリーズに統合され、製品名が「NeoCoreEX」に変更されております。

次に右側のペインで右クリックし「新規作成 - バインダドキュメント(B)...」を選びバインダドキュメントを作成します。名前はopml.xmlとします。作成したopml.xmlで右クリックし「XMLファイルのバインド(B)...」を選択し、表示されるダイアログでjohn_opml.xmlとjane_opml.xmlを選択します。次のような状態になったことを確認してください。

「バインダドキュメントを作成」
※現在はNeoCoreシリーズに統合され、製品名が「NeoCoreEX」に変更されております。

続けてopml.xmlを右クリックして「クエリー(Q)-クエリーの手動作成(M)...」を選ぶとクエリー入力用のダイアログが表示されます。ユーザの購読リストからoutline要素を抜き出すクエリーを記述します。

for $item in //outline
where $item/@type = 'rss'
return <item>{$item}</item>

クエリータイプで「XQuery」を選択してOKボタンを押してください。結果が表示されたら「IEで表示」ボタンを押して結果を見やすくします。

「XQuery」をIEで表示

for句を使用した場合との違いに気付きましたか。for句の場合はreturn句が4回呼び出されていますが、let句の場合は1回呼び出されているだけです。for句とlet句は両方記述することも複数記述することもできます。その結果は試してみてください。

さて欲しいのはユーザの購読リストに登録されているRSSフィードのリストです。先ほどの例では重複したRSSフィードが結果に含まれていましたが重複は省いてもう少し違う形のXMLを結果として取得してみます。

<feed-list>
{
    for $item in distinct-values(//outline/@xmlUrl[../@type='rss'])
    return <item>{$item}</item>
}
</feed-list>
結果
<?xml version="1.0" encoding="UTF-8" ?>
<xlnxql:result xlnxql:query="<feed-list>... (省略) ...>
  <feed-list>
    <item xmlUrl="http://youtube.com/rss/global/most_discussed_today.rss" />
    <item xmlUrl="http://rss.cnn.com/rss/cnn_topstories.rss" />>
    <item xmlUrl="http://www.flickr.com/services/feeds/photo_public.gne?tags=
animal&format=rss_100" />
  </feed-list>
</xlnxql:result>

これでサーバがチェックしなければならないRSSフィードのリストを取得することができました。結果から重複を省くためにdistinct-values関数を使用し、where句で記述していた条件はfor句のXPath式に記述してみました。

実際にRSSリーダとして仕上げるにはまだいろいろなことを検討しなければいけませんが、学習したXML技術を生かした実用的なアプリケーションとして作成にチャレンジしてみてください!

御相談、ご質問はこちら

サービスご案内資料や、特別資料「マニュアル作成の効率化とコストダウンを実現するポイントとは? 」がダウンロードできます。

最新事例の公開情報や、イベント・セミナー情報をお届けします。

pagetop ボタン
サイバーテックお知らせ画像
©2003 CyberTech corporation ltd. All Rights Reserved.