Before  Home  Next 


 RSSを取得する



1) はじめに

AjaxのAPIとWeberフレームワークのAPIを利用すれば、他サイトのRSSフィードを 取得することができます。

まずは簡単なサンプルから見ていきましょう。

ここで紹介するWebアプリケーションの構成は以下のとおりです





2) 入力画面の作成 (rss2.html)

まず入力となる画面を作成します。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>RSSを読み込み見出しを表示する (RSS 1.0 - RDF -)</title>
<link rel="stylesheet" href="main.css" type="text/css" media="all"/>
<script type="text/javascript" src="./../../js/xmlhttp.js"></script>
<script type="text/javascript">
//<![CDATA[
function rssSearch()
{
    rssURL = document.getElementById("siteURL").value;
    httpObj = createXMLHttpRequest(displayData);
    if (httpObj)
    {
        httpObj.open("GET","./html_4_0/rss/sample.wb?query="+rssURL+"&cache="+(new Date()).getTime(),true);
        httpObj.send(null);
    }
}
function displayData()
{
    if ((httpObj.readyState == 4) && (httpObj.status == 200))
    {
        parseRSS1(httpObj.responseXML);
    }else{
        document.getElementById("result").innerHTML = "読み込み中です...";
    }
}
// RSS 1.0 (RDF) を解析してタイトル(見出し)だけ表示
function parseRSS1(sXML)
{
    var resultText = rssTitle = "";
    var itemList = sXML.getElementsByTagName("item");
    for (var i=0; i<itemList.length; i++)
    {
        rssTitle = itemList[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
        rssUrl = itemList[i].getElementsByTagName("link")[0].childNodes[0].nodeValue;
        resultText += " <a href=\"" + rssUrl + "\">" + rssTitle + "</a><br/>";
    }
    document.getElementById("result").innerHTML = resultText;
}
//]]>
</script>
</head>
<body>
    <h2>RSSを読み込み見出しを表示する (RSS 1.0 - RDF -)</h2>
    この章では、多くのサイトで配信されているRSSを利用して見出し、
    リンク、記事内容の要約を表示させてみます。<br/>
    RSSに関しては読み込まれた内容に対して一括して検索して結果を表示するという処理を
    第六章の六で行いました。<br/>
    RSSに関しては詳解RSSという本がありますし、サイトで検索すればRSSフォーマットに
    関する情報が得られます。<br/>
    一口にRSSといっても簡単ではありません。<br/>
    というのもフォーマットがいくつかあり、それぞれ別の団体が作成していたりするため、
    互換性などがなかったりします。<br/>
    現在、配布されているRSSには以下の3つがあります。
    <p/>

    RSS 1.0 (RDF) 【日本で多く利用】 <br/>
    RSS 2.0 (RSS 0.9x)【米国で多く利用】 <br/>
    Atom【ブログで多く利用】 <br/>
    RSS 0.9を改良したものがRSS 2.0です。1.0ではありません。<br/>
    RSS 1.0はRDFフォーマットで別個です。フォーマットが乱立したため、統合しようという
    ことでAtomが出てきました。<br/>
    ブログではAtomで配布されているところが多くあります。<br/>
    まず、この項では日本で一番多く利用されているRSS 1.0 (RDF) のデータを表示させて
    みます。<br/>
    RDF/XMLに関してはWeb KANZAKIを参考にしてみてください。<br/>


    <form method="get" name="ajaxForm" onsubmit="rssSearch();return false;">
        <select id="siteURL">
            <option value="http://hotwired.goo.ne.jp/news/index.rdf">Wired</option>
            <option value="http://japan.cnet.com/rss/index.rdf">CNET</option>
            <option value="http://www3.asahi.com/rss/index.rdf">Asahi.com</option>
            <option value="http://nikkeibp.jp/jp/flash/index.rdf">日経BP</option>
            <option value="http://japan.zdnet.com/rss/news/index.rdf">ZDNET</option>
        </select>
        <input type="button" value="検索する" onClick="rssSearch()"/>
    </form>
    <div id="result"></div>
</body>
</html>



3) アクションクラスの作成(RssXmlSampleAction.java)

このサンプルのアクションクラスです。


package weber_4_0_sample.org.itscool.rss;

import org.itscool.commons.document.RequestToXmlDocument;
import org.itscool.weber.action.Action;
import org.itscool.weber.action.ActionBucket;
import org.itscool.weber.controller.Globals;

public class RssSampleAction extends Action {
    public static final String LINE=System.getProperty("line.separator");
    
    public String doExecute(ActionBucket bucket)throws Exception{
        String url = (String)bucket.getParameter("query");
        System.out.println(url);
        
        //指定したURLに対してリクエストを発行し、
        //受信結果をXMLで取得しています
        RequestToXmlDocument rssDocument = new RequestToXmlDocument(url);
        System.out.println(rssDocument.parseText("Shift_JIS"));
        
        bucket.printXml(rssDocument.getDocument());
        
        return Globals.RET_NOFORWARD;
    }
}

Before  Home  Next