RSS
日本語 | 豪華蜘蛛の巣場要約 |
英語 | Rich Site Summary、RDF Site Summary、Really Simple Syndication |
ふりがな | あーるえすえす |
フリガナ | アールエスエス |
ホームページの「要約」が出力されたXML。
膨大な数のWebサイトを逐一巡回するのは面倒なため、それを効率的にチェックするため、各Webサイトに書き込まれた記事の要約と、その記事へのURLをまとめたものがRSSである。
RSSは「RSSリーダー」と呼ばれるツールもしくはWebアプリケーションでチェックする。これらは複数のRSSを記事の日付順に表示する。ユーザーはその記事を流し見て、注目する記事があれば、そのリンクを辿って実際のWebサイトを閲覧する。
RSSをWebサイトで配信する場合、静的なファイルを作成するか、もしくはサーブレット等で出力する。RSSはRSSリーダーから頻繁にアクセスがあるため、サーブレット等で出力する場合には負荷が掛からないようにする必要がある。
RSSはXML形式となっているため、RSSフォーマットのXMLを作成し出力する。
一からXMLを作成しても良いが、Rss4j等、RSSを出力するための専用のライブラリも存在する。
RSSはまだあまり一般的には広まっていないが、ブログ等で積極的に配信していることもあり、使用者は増えつつある。
「読者に読んでもらうWebサイト」を作るためにも、配信を積極的に検討した方がいいだろう。
ちなみに「RSS」は、元となる明確な英語はない。
「RSS」は「RSS」である、ということだろう。
膨大な数のWebサイトを逐一巡回するのは面倒なため、それを効率的にチェックするため、各Webサイトに書き込まれた記事の要約と、その記事へのURLをまとめたものがRSSである。
RSSは「RSSリーダー」と呼ばれるツールもしくはWebアプリケーションでチェックする。これらは複数のRSSを記事の日付順に表示する。ユーザーはその記事を流し見て、注目する記事があれば、そのリンクを辿って実際のWebサイトを閲覧する。
RSSをWebサイトで配信する場合、静的なファイルを作成するか、もしくはサーブレット等で出力する。RSSはRSSリーダーから頻繁にアクセスがあるため、サーブレット等で出力する場合には負荷が掛からないようにする必要がある。
RSSはXML形式となっているため、RSSフォーマットのXMLを作成し出力する。
一からXMLを作成しても良いが、Rss4j等、RSSを出力するための専用のライブラリも存在する。
RSSはまだあまり一般的には広まっていないが、ブログ等で積極的に配信していることもあり、使用者は増えつつある。
「読者に読んでもらうWebサイト」を作るためにも、配信を積極的に検討した方がいいだろう。
ちなみに「RSS」は、元となる明確な英語はない。
「RSS」は「RSS」である、ということだろう。
参考サイト
// Sample.java
import java.io.StringWriter;
import java.io.IOException;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import churchillobjects.rss4j.RssChannel;
import churchillobjects.rss4j.RssChannelItem;
import churchillobjects.rss4j.RssDocument;
import churchillobjects.rss4j.RssDublinCore;
import churchillobjects.rss4j.generator.RssGenerator;
import churchillobjects.rss4j.generator.RssGenerationException;
public class Sample
{
public static void main( String[] args )
{
/*
■Rss4jの使用方法
1.
http://www.churchillobjects.com/c/13005.html
から
rss4j092.ja
というファイルをダウンロードしてください。
2.
この解凍してください(このファイルを直接クラスパスに
追加しないでください。拡張子を.zipに変えて解凍すると
いいかもしれません)
3.
libフォルダにある以下のファイルをクラスパスに追加してください。
rss4j.jar
4.
Rss4jは、Xercesを使用しますのでこちらも準備する必要があります。
http://xml.apache.org/xerces-j/
から任意のファイル(たとえばXerces-J-bin.2.7.1.zip)ダウンロードして
ください。
5.
以下のファイルをクラスパスに加えてください。
xercesImpl.jar
xml-apis.jar
注:この2ファイルをクラスパスに加えないと、実行時に以下の例外が
投げられます。
・xercesImpl.jarがない場合
java.lang.NoClassDefFoundError: org/apache/xml/serialize/BaseMarkupSerializer
at Sample.main(Sample.java:133)
・xml-apis.jarがない場合
java.lang.NoClassDefFoundError: org/w3c/dom/ranges/DocumentRange
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at org.apache.xerces.jaxp.DocumentBuilderImpl.<init>(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown Source)
at churchillobjects.rss4j.generator.RssGenerator.<init>(RssGenerator.java:184)
at churchillobjects.rss4j.generator.RssGeneratorImpl090.<init>(RssGeneratorImpl090.java:49)
at churchillobjects.rss4j.generator.RssGeneratorImpl091.<init>(RssGeneratorImpl091.java:56)
at churchillobjects.rss4j.generator.RssGeneratorImpl100.<init>(RssGeneratorImpl100.java:45)
at churchillobjects.rss4j.generator.RssGenerator.getGenerator(RssGenerator.java:171)
at churchillobjects.rss4j.generator.RssGenerator.generateRss(RssGenerator.java:148)
at Sample.main(Sample.java:142)
*/
StringWriter stringWriter = null;
try
{
/* RSSのバージョン */
String VERSION = "1.0";
/** ホームページのタイトル */
String HOMEPAGE_TITLE = "テストのホームページ";
/** ホームページのURL */
String HOMEPAGE_URL = "http://192.168.0.50/Programing/JavaA2Z/Word/00000935.html";
/** ホームページの説明 */
String HOMEPAGE_DESCRIPTION = "これはJavaA2Zの「RSS」単語のテストです。";
/** RSSのURI */
String HOMEPAGE_RSS_URI = "http://192.168.0.50/Programing/JavaA2Z/Word/00000935/rss";
/** RSSの言語 */
String HOMEPAGE_LANG = "ja";
/** コピーライト表記 */
String HOMEPAGE_COPYRIGHT = "(C)KAB-studio 2005 ALL RIGHTS RESERVED";
/** RSS 日付フォーマット。 */
String RSS_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'+09:00'";
SimpleDateFormat FORMATTER = new SimpleDateFormat( RSS_DATE_TIME_FORMAT );
// RSSドキュメントを作成。
RssDocument rssDocument = new RssDocument();
// バージョンはRSS1.0にします。
rssDocument.setVersion( VERSION );
// チャンネルの基本情報をセット。
RssChannel rssChannel = new RssChannel();
rssChannel.setChannelTitle( HOMEPAGE_TITLE );
rssChannel.setChannelLink( HOMEPAGE_URL );
rssChannel.setChannelDescription( HOMEPAGE_DESCRIPTION );
rssChannel.setChannelUri( HOMEPAGE_RSS_URI );
rssChannel.setChannelLanguage( HOMEPAGE_LANG );
rssChannel.setChannelCopyright( HOMEPAGE_COPYRIGHT );
// チャンネルの基本情報の方にも Dublin Core をセット。
RssDublinCore rssDublinCoreForChannel = new RssDublinCore();
rssDublinCoreForChannel.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) );
// date: 2005-11-24T19:49:28+09:00
rssChannel.setDublinCore( rssDublinCoreForChannel );
// これがないと
// 未宣言の名前空間の接頭語を参照します: 'dc'。リソース 'http://192.168.0.50/Programing/JavaA2Z/rss' の実行エラーです。ライン 24、位置 14
// <dc:date>2005-02-24T03:15:11+09:00</dc:date>
// ってエラーになります。
// アイテムをひとつ作ります。
RssChannelItem rssChannelItem = new RssChannelItem();
rssChannelItem.setItemTitle( "項目1:Writer" );
rssChannelItem.setItemLink( "http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html" );
rssChannelItem.setItemDescription( "J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は..." );
// 日付情報としてDublin Coreをセットします。
RssDublinCore rssDublinCore = new RssDublinCore();
rssDublinCore.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // 注:ここでは現在日時にしていますが、実際には記事の配信日時を指定します。
// date: 2005-11-24T19:49:28+09:00
rssChannelItem.setDublinCore( rssDublinCore );
// アイテムをチャンネルに追加します。
rssChannel.addItem( rssChannelItem );
// もうひとつアイテムを作ります。
rssChannelItem = new RssChannelItem();
rssChannelItem.setItemTitle( "項目2:StringWriter" );
rssChannelItem.setItemLink( "http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html" );
rssChannelItem.setItemDescription( "J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は..." );
// 日付情報としてDublin Coreをセットします。
rssDublinCore = new RssDublinCore();
rssDublinCore.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // 注:ここでは現在日時にしていますが、実際には記事の配信日時を指定します。
// date: 2005-11-24T19:49:28+09:00
rssChannelItem.setDublinCore( rssDublinCore );
// アイテムをチャンネルに追加します。
rssChannel.addItem( rssChannelItem );
// RssChannelをRssDocumentに追加します。
rssDocument.addChannel( rssChannel );
// 書き込みます。
stringWriter = new StringWriter();
RssGenerator.generateRss( rssDocument, stringWriter );
System.out.println( stringWriter.toString() );
/*
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000935/rss">
<title>テストのホームページ</title>
<description>これはJavaA2Zの「RSS」単語のテストです。</description>
<link>http://192.168.0.50/Programing/JavaA2Z/Word/00000935.html</link>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html"/>
<rdf:li rdf:resource="http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html"/>
</rdf:Seq>
</items>
<dc:date>2005-11-24T19:49:28+09:00</dc:date>
</channel>
<item rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html">
<title>項目1:Writer</title>
<link>http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html</link>
<description>J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は...</description>
<dc:date>2005-11-24T19:49:28+09:00</dc:date>
</item>
<item rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html">
<title>項目2:StringWriter</title>
<link>http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html</link>
<description>J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は...</description>
<dc:date>2005-11-24T19:49:28+09:00</dc:date>
</item>
</rdf:RDF>
*/
// ファイルに出力する場合は、これを
// UTF-8形式で出力すればいいでしょう。
}
catch( ParseException e )
{
e.printStackTrace();
}
catch( RssGenerationException e )
{
e.printStackTrace();
}
finally
{
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( stringWriter != null )
{
stringWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
import java.io.StringWriter;
import java.io.IOException;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import churchillobjects.rss4j.RssChannel;
import churchillobjects.rss4j.RssChannelItem;
import churchillobjects.rss4j.RssDocument;
import churchillobjects.rss4j.RssDublinCore;
import churchillobjects.rss4j.generator.RssGenerator;
import churchillobjects.rss4j.generator.RssGenerationException;
public class Sample
{
public static void main( String[] args )
{
/*
■Rss4jの使用方法
1.
http://www.churchillobjects.com/c/13005.html
から
rss4j092.ja
というファイルをダウンロードしてください。
2.
この解凍してください(このファイルを直接クラスパスに
追加しないでください。拡張子を.zipに変えて解凍すると
いいかもしれません)
3.
libフォルダにある以下のファイルをクラスパスに追加してください。
rss4j.jar
4.
Rss4jは、Xercesを使用しますのでこちらも準備する必要があります。
http://xml.apache.org/xerces-j/
から任意のファイル(たとえばXerces-J-bin.2.7.1.zip)ダウンロードして
ください。
5.
以下のファイルをクラスパスに加えてください。
xercesImpl.jar
xml-apis.jar
注:この2ファイルをクラスパスに加えないと、実行時に以下の例外が
投げられます。
・xercesImpl.jarがない場合
java.lang.NoClassDefFoundError: org/apache/xml/serialize/BaseMarkupSerializer
at Sample.main(Sample.java:133)
・xml-apis.jarがない場合
java.lang.NoClassDefFoundError: org/w3c/dom/ranges/DocumentRange
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at org.apache.xerces.jaxp.DocumentBuilderImpl.<init>(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown Source)
at churchillobjects.rss4j.generator.RssGenerator.<init>(RssGenerator.java:184)
at churchillobjects.rss4j.generator.RssGeneratorImpl090.<init>(RssGeneratorImpl090.java:49)
at churchillobjects.rss4j.generator.RssGeneratorImpl091.<init>(RssGeneratorImpl091.java:56)
at churchillobjects.rss4j.generator.RssGeneratorImpl100.<init>(RssGeneratorImpl100.java:45)
at churchillobjects.rss4j.generator.RssGenerator.getGenerator(RssGenerator.java:171)
at churchillobjects.rss4j.generator.RssGenerator.generateRss(RssGenerator.java:148)
at Sample.main(Sample.java:142)
*/
StringWriter stringWriter = null;
try
{
/* RSSのバージョン */
String VERSION = "1.0";
/** ホームページのタイトル */
String HOMEPAGE_TITLE = "テストのホームページ";
/** ホームページのURL */
String HOMEPAGE_URL = "http://192.168.0.50/Programing/JavaA2Z/Word/00000935.html";
/** ホームページの説明 */
String HOMEPAGE_DESCRIPTION = "これはJavaA2Zの「RSS」単語のテストです。";
/** RSSのURI */
String HOMEPAGE_RSS_URI = "http://192.168.0.50/Programing/JavaA2Z/Word/00000935/rss";
/** RSSの言語 */
String HOMEPAGE_LANG = "ja";
/** コピーライト表記 */
String HOMEPAGE_COPYRIGHT = "(C)KAB-studio 2005 ALL RIGHTS RESERVED";
/** RSS 日付フォーマット。 */
String RSS_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'+09:00'";
SimpleDateFormat FORMATTER = new SimpleDateFormat( RSS_DATE_TIME_FORMAT );
// RSSドキュメントを作成。
RssDocument rssDocument = new RssDocument();
// バージョンはRSS1.0にします。
rssDocument.setVersion( VERSION );
// チャンネルの基本情報をセット。
RssChannel rssChannel = new RssChannel();
rssChannel.setChannelTitle( HOMEPAGE_TITLE );
rssChannel.setChannelLink( HOMEPAGE_URL );
rssChannel.setChannelDescription( HOMEPAGE_DESCRIPTION );
rssChannel.setChannelUri( HOMEPAGE_RSS_URI );
rssChannel.setChannelLanguage( HOMEPAGE_LANG );
rssChannel.setChannelCopyright( HOMEPAGE_COPYRIGHT );
// チャンネルの基本情報の方にも Dublin Core をセット。
RssDublinCore rssDublinCoreForChannel = new RssDublinCore();
rssDublinCoreForChannel.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) );
// date: 2005-11-24T19:49:28+09:00
rssChannel.setDublinCore( rssDublinCoreForChannel );
// これがないと
// 未宣言の名前空間の接頭語を参照します: 'dc'。リソース 'http://192.168.0.50/Programing/JavaA2Z/rss' の実行エラーです。ライン 24、位置 14
// <dc:date>2005-02-24T03:15:11+09:00</dc:date>
// ってエラーになります。
// アイテムをひとつ作ります。
RssChannelItem rssChannelItem = new RssChannelItem();
rssChannelItem.setItemTitle( "項目1:Writer" );
rssChannelItem.setItemLink( "http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html" );
rssChannelItem.setItemDescription( "J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は..." );
// 日付情報としてDublin Coreをセットします。
RssDublinCore rssDublinCore = new RssDublinCore();
rssDublinCore.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // 注:ここでは現在日時にしていますが、実際には記事の配信日時を指定します。
// date: 2005-11-24T19:49:28+09:00
rssChannelItem.setDublinCore( rssDublinCore );
// アイテムをチャンネルに追加します。
rssChannel.addItem( rssChannelItem );
// もうひとつアイテムを作ります。
rssChannelItem = new RssChannelItem();
rssChannelItem.setItemTitle( "項目2:StringWriter" );
rssChannelItem.setItemLink( "http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html" );
rssChannelItem.setItemDescription( "J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は..." );
// 日付情報としてDublin Coreをセットします。
rssDublinCore = new RssDublinCore();
rssDublinCore.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // 注:ここでは現在日時にしていますが、実際には記事の配信日時を指定します。
// date: 2005-11-24T19:49:28+09:00
rssChannelItem.setDublinCore( rssDublinCore );
// アイテムをチャンネルに追加します。
rssChannel.addItem( rssChannelItem );
// RssChannelをRssDocumentに追加します。
rssDocument.addChannel( rssChannel );
// 書き込みます。
stringWriter = new StringWriter();
RssGenerator.generateRss( rssDocument, stringWriter );
System.out.println( stringWriter.toString() );
/*
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000935/rss">
<title>テストのホームページ</title>
<description>これはJavaA2Zの「RSS」単語のテストです。</description>
<link>http://192.168.0.50/Programing/JavaA2Z/Word/00000935.html</link>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html"/>
<rdf:li rdf:resource="http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html"/>
</rdf:Seq>
</items>
<dc:date>2005-11-24T19:49:28+09:00</dc:date>
</channel>
<item rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html">
<title>項目1:Writer</title>
<link>http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html</link>
<description>J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は...</description>
<dc:date>2005-11-24T19:49:28+09:00</dc:date>
</item>
<item rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html">
<title>項目2:StringWriter</title>
<link>http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html</link>
<description>J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は...</description>
<dc:date>2005-11-24T19:49:28+09:00</dc:date>
</item>
</rdf:RDF>
*/
// ファイルに出力する場合は、これを
// UTF-8形式で出力すればいいでしょう。
}
catch( ParseException e )
{
e.printStackTrace();
}
catch( RssGenerationException e )
{
e.printStackTrace();
}
finally
{
// 最後にclose()メソッドを呼んで後処理をします。
// また、これは必ず行うため、finally内で行います。
try
{
if( stringWriter != null )
{
stringWriter.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
// Sample.java import java.io.StringWriter; import java.io.IOException; import java.util.Calendar; import java.text.SimpleDateFormat; import java.text.ParseException; import churchillobjects.rss4j.RssChannel; import churchillobjects.rss4j.RssChannelItem; import churchillobjects.rss4j.RssDocument; import churchillobjects.rss4j.RssDublinCore; import churchillobjects.rss4j.generator.RssGenerator; import churchillobjects.rss4j.generator.RssGenerationException; public class Sample { public static void main( String[] args ) { /* ■Rss4jの使用方法 1. http://www.churchillobjects.com/c/13005.html から rss4j092.ja というファイルをダウンロードしてください。 2. この解凍してください(このファイルを直接クラスパスに 追加しないでください。拡張子を.zipに変えて解凍すると いいかもしれません) 3. libフォルダにある以下のファイルをクラスパスに追加してください。 rss4j.jar 4. Rss4jは、Xercesを使用しますのでこちらも準備する必要があります。 http://xml.apache.org/xerces-j/ から任意のファイル(たとえばXerces-J-bin.2.7.1.zip)ダウンロードして ください。 5. 以下のファイルをクラスパスに加えてください。 xercesImpl.jar xml-apis.jar 注:この2ファイルをクラスパスに加えないと、実行時に以下の例外が 投げられます。 ・xercesImpl.jarがない場合 java.lang.NoClassDefFoundError: org/apache/xml/serialize/BaseMarkupSerializer at Sample.main(Sample.java:133) ・xml-apis.jarがない場合 java.lang.NoClassDefFoundError: org/w3c/dom/ranges/DocumentRange at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:502) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at java.net.URLClassLoader.defineClass(URLClassLoader.java:250) at java.net.URLClassLoader.access$100(URLClassLoader.java:54) at java.net.URLClassLoader$1.run(URLClassLoader.java:193) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:186) at java.lang.ClassLoader.loadClass(ClassLoader.java:299) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265) at java.lang.ClassLoader.loadClass(ClassLoader.java:255) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:502) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at java.net.URLClassLoader.defineClass(URLClassLoader.java:250) at java.net.URLClassLoader.access$100(URLClassLoader.java:54) at java.net.URLClassLoader$1.run(URLClassLoader.java:193) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:186) at java.lang.ClassLoader.loadClass(ClassLoader.java:299) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265) at java.lang.ClassLoader.loadClass(ClassLoader.java:255) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315) at org.apache.xerces.jaxp.DocumentBuilderImpl.<init>(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.newDocumentBuilder(Unknown Source) at churchillobjects.rss4j.generator.RssGenerator.<init>(RssGenerator.java:184) at churchillobjects.rss4j.generator.RssGeneratorImpl090.<init>(RssGeneratorImpl090.java:49) at churchillobjects.rss4j.generator.RssGeneratorImpl091.<init>(RssGeneratorImpl091.java:56) at churchillobjects.rss4j.generator.RssGeneratorImpl100.<init>(RssGeneratorImpl100.java:45) at churchillobjects.rss4j.generator.RssGenerator.getGenerator(RssGenerator.java:171) at churchillobjects.rss4j.generator.RssGenerator.generateRss(RssGenerator.java:148) at Sample.main(Sample.java:142) */ StringWriter stringWriter = null; try { /* RSSのバージョン */ String VERSION = "1.0"; /** ホームページのタイトル */ String HOMEPAGE_TITLE = "テストのホームページ"; /** ホームページのURL */ String HOMEPAGE_URL = "http://192.168.0.50/Programing/JavaA2Z/Word/00000935.html"; /** ホームページの説明 */ String HOMEPAGE_DESCRIPTION = "これはJavaA2Zの「RSS」単語のテストです。"; /** RSSのURI */ String HOMEPAGE_RSS_URI = "http://192.168.0.50/Programing/JavaA2Z/Word/00000935/rss"; /** RSSの言語 */ String HOMEPAGE_LANG = "ja"; /** コピーライト表記 */ String HOMEPAGE_COPYRIGHT = "(C)KAB-studio 2005 ALL RIGHTS RESERVED"; /** RSS 日付フォーマット。 */ String RSS_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'+09:00'"; SimpleDateFormat FORMATTER = new SimpleDateFormat( RSS_DATE_TIME_FORMAT ); // RSSドキュメントを作成。 RssDocument rssDocument = new RssDocument(); // バージョンはRSS1.0にします。 rssDocument.setVersion( VERSION ); // チャンネルの基本情報をセット。 RssChannel rssChannel = new RssChannel(); rssChannel.setChannelTitle( HOMEPAGE_TITLE ); rssChannel.setChannelLink( HOMEPAGE_URL ); rssChannel.setChannelDescription( HOMEPAGE_DESCRIPTION ); rssChannel.setChannelUri( HOMEPAGE_RSS_URI ); rssChannel.setChannelLanguage( HOMEPAGE_LANG ); rssChannel.setChannelCopyright( HOMEPAGE_COPYRIGHT ); // チャンネルの基本情報の方にも Dublin Core をセット。 RssDublinCore rssDublinCoreForChannel = new RssDublinCore(); rssDublinCoreForChannel.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // date: 2005-11-24T19:49:28+09:00 rssChannel.setDublinCore( rssDublinCoreForChannel ); // これがないと // 未宣言の名前空間の接頭語を参照します: 'dc'。リソース 'http://192.168.0.50/Programing/JavaA2Z/rss' の実行エラーです。ライン 24、位置 14 // <dc:date>2005-02-24T03:15:11+09:00</dc:date> // ってエラーになります。 // アイテムをひとつ作ります。 RssChannelItem rssChannelItem = new RssChannelItem(); rssChannelItem.setItemTitle( "項目1:Writer" ); rssChannelItem.setItemLink( "http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html" ); rssChannelItem.setItemDescription( "J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は..." ); // 日付情報としてDublin Coreをセットします。 RssDublinCore rssDublinCore = new RssDublinCore(); rssDublinCore.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // 注:ここでは現在日時にしていますが、実際には記事の配信日時を指定します。 // date: 2005-11-24T19:49:28+09:00 rssChannelItem.setDublinCore( rssDublinCore ); // アイテムをチャンネルに追加します。 rssChannel.addItem( rssChannelItem ); // もうひとつアイテムを作ります。 rssChannelItem = new RssChannelItem(); rssChannelItem.setItemTitle( "項目2:StringWriter" ); rssChannelItem.setItemLink( "http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html" ); rssChannelItem.setItemDescription( "J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は..." ); // 日付情報としてDublin Coreをセットします。 rssDublinCore = new RssDublinCore(); rssDublinCore.setDate( FORMATTER.format( Calendar.getInstance().getTime() ) ); // 注:ここでは現在日時にしていますが、実際には記事の配信日時を指定します。 // date: 2005-11-24T19:49:28+09:00 rssChannelItem.setDublinCore( rssDublinCore ); // アイテムをチャンネルに追加します。 rssChannel.addItem( rssChannelItem ); // RssChannelをRssDocumentに追加します。 rssDocument.addChannel( rssChannel ); // 書き込みます。 stringWriter = new StringWriter(); RssGenerator.generateRss( rssDocument, stringWriter ); System.out.println( stringWriter.toString() ); /* <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <channel rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000935/rss"> <title>テストのホームページ</title> <description>これはJavaA2Zの「RSS」単語のテストです。</description> <link>http://192.168.0.50/Programing/JavaA2Z/Word/00000935.html</link> <items> <rdf:Seq> <rdf:li rdf:resource="http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html"/> <rdf:li rdf:resource="http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html"/> </rdf:Seq> </items> <dc:date>2005-11-24T19:49:28+09:00</dc:date> </channel> <item rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html"> <title>項目1:Writer</title> <link>http://192.168.0.50/Programing/JavaA2Z/Word/00000914.html</link> <description>J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は...</description> <dc:date>2005-11-24T19:49:28+09:00</dc:date> </item> <item rdf:about="http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html"> <title>項目2:StringWriter</title> <link>http://192.168.0.50/Programing/JavaA2Z/Word/00000908.html</link> <description>J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名は...</description> <dc:date>2005-11-24T19:49:28+09:00</dc:date> </item> </rdf:RDF> */ // ファイルに出力する場合は、これを // UTF-8形式で出力すればいいでしょう。 } catch( ParseException e ) { e.printStackTrace(); } catch( RssGenerationException e ) { e.printStackTrace(); } finally { // 最後にclose()メソッドを呼んで後処理をします。 // また、これは必ず行うため、finally内で行います。 try { if( stringWriter != null ) { stringWriter.close(); } } catch( IOException e ) { e.printStackTrace(); } } } }