JavaでRSSファイルを出力する必要がありライブラリを調べてみました。

RSSLibjは、名前は出てくるが当初ダウンロードサイトや、正式なサイトを探せず。Infomaを少し試してみました。
最初は楽だと感じましたが、RSS20の出力やATOMの出力を同じコードで出力させる事を考えていくとInfoma総ての動作を把握する必要がある。覚えるのが手間だし、LGPLライセンスなので改良するのも手間、出力がFileのみでStreamへの出力ができない。

結局何のライブラリを使うにせよ、RSS要素の仕様はきっちりと押さえる必要があり、そうすると出力をするだけなら自分で直接書いてしまった方が良いという結論に達しました。(ライブラリを使用するための学習コストは勿体ない)

結局JDOMを使って書いてしまいましたが、何で書くのが楽なんでしょうか….

JDOMを使用してRSS1.0を出力するコード

private void jdom10(OutputStream output,List aList, FeedConfig aConfig) {
Document doc = new Document();
//Parent is doc
//
Map mapData = new HashMap();
mapData.put("href",aConfig.getXSLStyleSheet());
mapData.put("type","text/xsl");
mapData.put("media","screen");
ProcessingInstruction instruction = new ProcessingInstruction("xml-stylesheet",mapData);
doc.setContent(instruction);
//Parent is doc
//
Namespace rdf  = Namespace.getNamespace("rdf","http://www.w3.org/1999/02/22-rdf-syntax-ns#");
Namespace dc   = Namespace.getNamespace("dc","http://purl.org/dc/elements/1.1/");
Namespace none = Namespace.getNamespace("","http://purl.org/rss/1.0/");
Element root = new Element("RDF",rdf);
doc.addContent(root);
root.addNamespaceDeclaration(dc);
root.addNamespaceDeclaration(none);
//Parent is root.
Element channel = new Element("channel",none);
channel.setAttribute("about",aConfig.getUrl().toString(),rdf);
root.addContent(channel);
//parent is channel.
Element title = new Element("title",none);
title.setText(aConfig.getTitle());
channel.addContent(title);
Element link = new Element("link",none);
link.setText(aConfig.getUrl().toString());
channel.addContent(link);
Element description = new Element("description",none);
description.setText(aConfig.getDescription());
channel.addContent(description);
Element language = new Element("language",dc);
language.setText(aConfig.getLanguage());
channel.addContent(language);
Element creator = new Element("creator",dc);
creator.setText(aConfig.getManagingEditor());
channel.addContent(creator);
String dateISO8601 = TaoDateFormat.ISO8601Format(new Date());
Element date = new Element("date",dc);
date.setText(dateISO8601);
channel.addContent(date);
//parent is channel.
Element items = new Element("items",none);
channel.addContent(items);
//parent is items.
Element seq = new Element("Seq",rdf);
items.addContent(seq);
for(UIBookmark bookmark: aList){
Element li = new Element("li",rdf);
li.setAttribute("resource",bookmark.getUrl(),rdf);
seq.addContent(li);
}
for(UIBookmark bookmark: aList){
//Parent is root.
Element item = new Element("item",none);
item.setAttribute("about",bookmark.getUrl(),rdf);
root.addContent(item);
Element itemTitle = new Element("title",none);
itemTitle.setText(bookmark.getTitle());
item.addContent(itemTitle);
Element itemLink = new Element("link",none);
itemLink.setText(bookmark.getUrl());
item.addContent(itemLink);
Element itemDescription = new Element("description",none);
itemDescription.setText(bookmark.getDescription());
item.addContent(itemDescription);
Element itemDate = new Element("date",dc);
itemDate.setText(dateISO8601);
item.addContent(itemDate);
}
try {
//出力形式を指定(Indent cr ...)
Format format = Format.getPrettyFormat();
XMLOutputter serializer = new XMLOutputter(format);
serializer.output(doc, output);
} catch (IOException e) {
if(LOG.isErrorEnabled()){
LOG.error("jdom10:",e);
}
}
}