RSS feeds with Java 原文来自:http://www.javaarch.net/jiagoushi/479.htm
-
RSS - 简易信息聚合
RSS文档是一种XML格式的文件,遵循RSS规范,我们可以使用java的xml操作来读写RSS文档。
2.RSS的工程和领域模型
/* * Represents one RSS message */ public class FeedMessage { String title; String description; String link; String author; String guid; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getGuid() { return guid; } public void setGuid(String guid) { this.guid = guid; } @Override public String toString() { return "FeedMessage [title=" + title + ", description=" + description + ", link=" + link + ", author=" + author + ", guid=" + guid + "]"; } }
Feed.java
import java.util.ArrayList; import java.util.List; /* * Stores an RSS feed */ public class Feed { final String title; final String link; final String description; final String language; final String copyright; final String pubDate; final List<FeedMessage> entries = new ArrayList<FeedMessage>(); public Feed(String title, String link, String description, String language, String copyright, String pubDate) { this.title = title; this.link = link; this.description = description; this.language = language; this.copyright = copyright; this.pubDate = pubDate; } public List<FeedMessage> getMessages() { return entries; } public String getTitle() { return title; } public String getLink() { return link; } public String getDescription() { return description; } public String getLanguage() { return language; } public String getCopyright() { return copyright; } public String getPubDate() { return pubDate; } @Override public String toString() { return "Feed [copyright=" + copyright + ", description=" + description + ", language=" + language + ", link=" + link + ", pubDate=" + pubDate + ", title=" + title + "]"; } }
3.使用Stax读取RSS feed
RSSFeedParser.java
import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.XMLEvent; import de.vogella.rss.model.Feed; import de.vogella.rss.model.FeedMessage; public class RSSFeedParser { static final String TITLE = "title"; static final String DESCRIPTION = "description"; static final String CHANNEL = "channel"; static final String LANGUAGE = "language"; static final String COPYRIGHT = "copyright"; static final String LINK = "link"; static final String AUTHOR = "author"; static final String ITEM = "item"; static final String PUB_DATE = "pubDate"; static final String GUID = "guid"; final URL url; public RSSFeedParser(String feedUrl) { try { this.url = new URL(feedUrl); } catch (MalformedURLException e) { throw new RuntimeException(e); } } public Feed readFeed() { Feed feed = null; try { boolean isFeedHeader = true; // Set header values intial to the empty string String description = ""; String title = ""; String link = ""; String language = ""; String copyright = ""; String author = ""; String pubdate = ""; String guid = ""; // First create a new XMLInputFactory XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // Setup a new eventReader InputStream in = read(); XMLEventReader eventReader = inputFactory.createXMLEventReader(in); // Read the XML document while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); if (event.isStartElement()) { String localPart = event.asStartElement().getName() .getLocalPart(); switch (localPart) { case ITEM: if (isFeedHeader) { isFeedHeader = false; feed = new Feed(title, link, description, language, copyright, pubdate); } event = eventReader.nextEvent(); break; case TITLE: title = getCharacterData(event, eventReader); break; case DESCRIPTION: description = getCharacterData(event, eventReader); break; case LINK: link = getCharacterData(event, eventReader); break; case GUID: guid = getCharacterData(event, eventReader); break; case LANGUAGE: language = getCharacterData(event, eventReader); break; case AUTHOR: author = getCharacterData(event, eventReader); break; case PUB_DATE: pubdate = getCharacterData(event, eventReader); break; case COPYRIGHT: copyright = getCharacterData(event, eventReader); break; } } else if (event.isEndElement()) { if (event.asEndElement().getName().getLocalPart() == (ITEM)) { FeedMessage message = new FeedMessage(); message.setAuthor(author); message.setDescription(description); message.setGuid(guid); message.setLink(link); message.setTitle(title); feed.getMessages().add(message); event = eventReader.nextEvent(); continue; } } } } catch (XMLStreamException e) { throw new RuntimeException(e); } return feed; } private String getCharacterData(XMLEvent event, XMLEventReader eventReader) throws XMLStreamException { String result = ""; event = eventReader.nextEvent(); if (event instanceof Characters) { result = event.asCharacters().getData(); } return result; } private InputStream read() { try { return url.openStream(); } catch (IOException e) { throw new RuntimeException(e); } } }
ReadTest.java测试读RSS文档
public class ReadTest {
public static void main(String[] args) {
RSSFeedParser parser = new RSSFeedParser("http://www.vogella.de/article.rss");
Feed feed = parser.readFeed();
System.out.println(feed);
for (FeedMessage message : feed.getMessages()) {
System.out.println(message);
}
}
}
4.使用Stax来生成RSS文档
import java.io.FileOutputStream; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartDocument; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import de.vogella.rss.model.Feed; import de.vogella.rss.model.FeedMessage; public class RSSFeedWriter { private String outputFile; private Feed rssfeed; public RSSFeedWriter(Feed rssfeed, String outputFile) { this.rssfeed = rssfeed; this.outputFile = outputFile; } public void write() throws Exception { // Create a XMLOutputFactory XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); // Create XMLEventWriter XMLEventWriter eventWriter = outputFactory .createXMLEventWriter(new FileOutputStream(outputFile)); // Create a EventFactory XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); // Create and write Start Tag StartDocument startDocument = eventFactory.createStartDocument(); eventWriter.add(startDocument); // Create open tag eventWriter.add(end); StartElement rssStart = eventFactory.createStartElement("", "", "rss"); eventWriter.add(rssStart); eventWriter.add(eventFactory.createAttribute("version", "2.0")); eventWriter.add(end); eventWriter.add(eventFactory.createStartElement("", "", "channel")); eventWriter.add(end); // Write the different nodes createNode(eventWriter, "title", rssfeed.getTitle()); createNode(eventWriter, "link", rssfeed.getLink()); createNode(eventWriter, "description", rssfeed.getDescription()); createNode(eventWriter, "language", rssfeed.getLanguage()); createNode(eventWriter, "copyright", rssfeed.getCopyright()); createNode(eventWriter, "pubdate", rssfeed.getPubDate()); for (FeedMessage entry : rssfeed.getMessages()) { eventWriter.add(eventFactory.createStartElement("", "", "item")); eventWriter.add(end); createNode(eventWriter, "title", entry.getTitle()); createNode(eventWriter, "description", entry.getDescription()); createNode(eventWriter, "link", entry.getLink()); createNode(eventWriter, "author", entry.getAuthor()); createNode(eventWriter, "guid", entry.getGuid()); eventWriter.add(end); eventWriter.add(eventFactory.createEndElement("", "", "item")); eventWriter.add(end); } eventWriter.add(end); eventWriter.add(eventFactory.createEndElement("", "", "channel")); eventWriter.add(end); eventWriter.add(eventFactory.createEndElement("", "", "rss")); eventWriter.add(end); eventWriter.add(eventFactory.createEndDocument()); eventWriter.close(); } private void createNode(XMLEventWriter eventWriter, String name, String value) throws XMLStreamException { XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); XMLEvent tab = eventFactory.createDTD("\t"); // Create Start node StartElement sElement = eventFactory.createStartElement("", "", name); eventWriter.add(tab); eventWriter.add(sElement); // Create Content Characters characters = eventFactory.createCharacters(value); eventWriter.add(characters); // Create End node EndElement eElement = eventFactory.createEndElement("", "", name); eventWriter.add(eElement); eventWriter.add(end); } }
WriteTest.java
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import de.vogella.rss.model.Feed; import de.vogella.rss.model.FeedMessage; import de.vogella.rss.write.RSSFeedWriter; public class WriteTest { public static void main(String[] args) { // Create the rss feed String copyright = "Copyright hold by Lars Vogel"; String title = "Eclipse and Java Information"; String description = "Eclipse and Java Information"; String language = "en"; String link = "http://www.vogella.de"; Calendar cal = new GregorianCalendar(); Date creationDate = cal.getTime(); SimpleDateFormat date_format = new SimpleDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US); String pubdate = date_format.format(creationDate); Feed rssFeeder = new Feed(title, link, description, language, copyright, pubdate); // Now add one example entry FeedMessage feed = new FeedMessage(); feed.setTitle("RSSFeed"); feed.setDescription("This is a description"); feed.setAuthor("nonsense@somewhere.de (Lars Vogel)"); feed.setGuid("http://www.vogella.de/articles/RSSFeed/article.html"); feed.setLink("http://www.vogella.de/articles/RSSFeed/article.html"); rssFeeder.getMessages().add(feed); // Now write the file RSSFeedWriter writer = new RSSFeedWriter(rssFeeder, "articles.rss"); try { writer.write(); } catch (Exception e) { e.printStackTrace(); } } }
相关推荐
一款便利的rss阅读器,想看什么,就用它帮你实现好了。
RSS Submit Pro是一个RSS feeds提交工具,可以自动想主要的RSS网站提交RSS feed。它使用方便,速度也很快,是一个不错的网站推广工具。 RSS Submit是一个自动将你的RSS Feed提交到各大RSS搜索引擎或者索引的工具,...
rssfeeds-main.rar
rssfeeds:结合rss feeds
Java and XML, 3rd Edition, shows you how ... You'll learn how to create, read, and modify RSS feeds for syndicated content and use XML to power the next generation of websites with Ajax and Adobe Flash.
Content Syndication with RSS offers webloggers, developers, and the programmers who support them a thorough explanation of syndication in general and RSS in particular. Written for web developers who...
Atom-feeds.zip,golang rss/atom生成器库大猩猩/饲料,atom是一个用web技术构建的开源文本编辑器。
您将学习到如何为同步的内容创建、读取或者修改RSS feeds,以及如何运用XML、Ajax和Adobe Flash来为下一代的网络站点注入活力。 书中的主题如下: *XML基础,包括DTD、命名空间(namespace)、XML Schema和...
主要介绍了利用Fix Rss Feeds插件修复WordPress的Feed显示错误的方法,需要的朋友可以参考下
jekyll-rss-feeds:用于为您的Jekyll博客呈现RSS feed的模板
您将学习到如何为同步的内容创建、读取或者修改RSS feeds,以及如何运用XML、Ajax和Adobe Flash来为下一代的网络站点注入活力。 书中的主题如下: XML基础,包括DTD、命名空间(namespace)、XML Schema和数据格式...
gatsby-source-rss-feeds 用于基于从RSS feed将数据拉入Gatsby的源插件。 问题 当加载具有空值的xml文件时, gatsby-source-rss-feed转换了对象中的rss,从而产生了错误。 这个解决方案 在插件上构建并确保处理了空...
RSS提要阅读器,带GDrive同步 *本地存储用于保留订阅源订阅和元数据(IndexedDB)*没有服务器端用于处理数据(例如,它可以读取Intranet订阅源)*使用Google云端硬盘(可选)在计算机之间进行同步(订阅列表和*“ ...
Pelican 是一个法国人用 python 写的用于生成静态页面的... Import from WordPress, Dotclear, or RSS feeds Integration with external tools: Twitter, Google Analytics, etc. (optional) 标签:Pelican
罗马是用于RSS和Atom提要的Java框架。 该框架包含几个模块: :warning: 由于缺乏积极的维护者,该项目的维护和开发目前受到限制。 考虑成为一个积极的维护者。 项目结构 模块 描述 rome 用于生成和解析RSS和Atom...
安全-RSS-Feeds 这是一个非常简单的OPML文件,可以导入到您喜欢的RSS阅读器中。 随时与我分享您发现有趣的任何InfoSec相关的链接/博客/信息/用户。
pwc-feeds使用Python 3.8为带有代码的论文提供RSS feed。 作为免责声明,它与具有Codes的Papers没有关系。 链接 原始HTML列表:| | 非官方RSS供稿:| | 部署方式 已配置到无服务器部署。 它需要以下文件: ...
什么是获取RSS Feed URL扩展? 获取RSS提要URL是Google Chrome扩展程序,提供指向网站的各种RSS / Atom提要的链接。 实际上,网站并不总是提供指向RSS feed的直接链接。 然后有必要查看网站的源代码并找到提要的...
A simple, lightweight and easy to use library to parse rss feeds into your app. Requirements This library requires minimum sdk version 9. Also add Internet permission to your application manifest ...
rss-feeds