作者:Brian McBride
发表时间:2000年9月2日
原文链接:
http://www.hpl.hp.co.uk/people/bwm/rdf/jena/rssinjena.htm译者:
dlee翻译时间:2001年5月26日
RSS 1.0 是最近宣布的一个格式,顺从于 W3C 的 RDF (资源定义框架),用来分发(distributing) 站点摘要 (site summary) 和企业联合 (syndication) 元数据。一个站点摘要文档的例子可以在规范中找到。Jena 是一套实验性的用来处理 RDF 的 Java API。这篇笔记描述了一个应用程序使用 Jena 来将一个站点摘要文档翻译成 HTML。整个程序的源代码作为 RenderToHTML 可以在 Jena 发布的例子包里得到。
这篇文章和例子代码基于 RSS 规范候选发布版本1 (Release Candidate 1 version)。
这个应用程序以创建一个 RDF 模型开始,实际上在内存中是一个 RDF statement 的集合。然后解析站点摘要文档,使用一个 RDF 解析器,并加载 statement 到新创建的模型中。
Model model = new ModelMem();
model.read("
http://www.xml.com/xml/news.rss");
在写出一个样板 HTML 头后,程序列出和处理在输入流中的每个 channel。在 RDF 术语中,channel 是具有一个 rdf:type 属性的 rss:channel 的资源。我们使用 Jena API 来列出具有一个有这个值的 rdf:type 属性的所有的资源。在下面的代码中,假设输出是一个接收 HTML 输出的 PrintWriter。
ResIterator channels = model.listSubjectsWithProperty(RDF.type, RSS.channel);
while (channels.hasNext()) {
renderChannel(channels.next(), out);
}
为了呈现 (render) 一个 channel,程序首先写出它的 title,description 和相关的 image 和 textinput 字段 (如果有的话)。getProperty 方法用来得到 channel 的 title,link 和 description 属性,随后这些可以被呈现为 HTML。
void renderChannel(Resource channel, PrintStream out)
throws RDFException {
String url = null;
String title = null;
String desc = null;
url = channel.getProperty(RSS.link).getString();
title = channel.getProperty(RSS.title).getString();
desc = channel.getProperty(RSS.description).getString();
一个 channel 可以有一个相关联的 image 和 textinput,测试是否存在这些属性和是否需要调用合适的方法来呈现它们是很简单的。
if (channel.hasProperty(RSS.image)) {
renderImage(channel.getProperty(RSS.image) .getResource(), out);
}
if (channel.hasProperty(RSS.textinput)) {
renderImage(channel.getProperty(RSS.textinput) .getResource(), out);
}
为了处理一个 image,同样的调用被用来确定 image 的属性。
String url = null;
String title = null;
// does the image have a link?
if (image.hasProperty(RSS.link)) {
url = image.getProperty(RSS.link).getString();
}
// does the image have a title?
if (image.hasProperty(RSS.title)) {
title = image.getProperty(RSS.title).getString();
} image.getProperty(SSF.title).getString();
然后这个 image 可以被呈现成为 output stream。textinput 以 相似的方法处理。
channel 有一个 items 属性,它的值为一个 RDF sequence。因此使用 getProperty 方法得到这个 sequence 就很简单的了。然后迭代每一个元素以呈现它。
if (channel.hasProperty(RSS.items)) {
Seq items = channel.getProperty(RSS.items).getSeq();
for (int i=1; i<= items.size(); i++) {
renderItem(items.getResource(i), out);
}
}
以相同的模式呈现每一个 items。首先得到需要呈现的 items 的属性,然后写出 HTML。
void renderItem(Resource item, PrintWriter out) {
String url = item.getProperty(RSS.link).getString();
String title = item.getProperty(RSS.title).getString();
String desc = item.getProperty(RSS.description) .getString();
...
}
使用 Jena 来处理 RSS 1.0 流是简单和直接的。
Brian McBride
HP实验室,2000年9月2日
修改于2000年12月2日