XML工房

〔作品3〕簡易RSSビューアの作成

~第3章~ RSSビューアを発展させる

2006年7月号掲載記事

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

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

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

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

これらはユーザ情報をサーバで一元管理することで生まれる利点です。サーバでデータを効率よく管理するためにはデータベースが用いられます。現在一般的に使用されているのはRDBMS(リレーショナルデータベース管理システム)でこれはデータを2次元の表として管理します。多くの用途で適合しますが、例えばツリー構造のように表では難しいがXMLなら上手く表現できるというデータの管理には向いていません。XMLデータベースと呼ばれる製品はXMLをそのまま格納します。RDBではデータの検索にSQLを使用しますが、XMLデータベースではXQueryという言語を使用します。XQueryはW3Cで検討されていますが現在は勧告候補です。勧告までにはもう少し時間がかかるかも知れません。XMLデータベース製品は商用製品の他にオープンソースで開発されているものもあります。オープンソースでは eXist (http://exist.sourceforge.net/)の活動が活発なようです。今回は商用製品であるCyber Luxeonを使用してXQueryを試してみたいと思います。

◇Cyber Luxeon 1.0の30日試用限定の評価版をご利用いただけます。
こちらからお申込みください。
https://www.cybertech.co.jp/inquire/trial/

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>

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

図:イメージ

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

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

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

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

図:イメージ

クエリーの記述と結果を見比べてみて動作が理解できたでしょうか。
XQueryはRDBのSQLに相当するものといってもSQLのような構文を想定していた方は少し面喰ったと思いますがイメージ的にはfor句がFROM句に、return句がSELECT句に相当しSQLとは逆の順番に記述するような感じです。
where句は分かり易いと思います。

for句の部分にはlet句を記述することもできます。

let $item := //outline
where $item/@type = 'rss'
return <item>{$item}</item>

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技術を生かした実用的なアプリケーションとして作成にチャレンジしてみてください!

株式会社サイバーテック
ソフトウェア開発部
山口 洋一
http://www.cybertech.co.jp/

← 前の記事を読む

「XML工房」のIndexへ戻る

ページトップへ▲

HOMEへ戻る