Rome库解析的RSS内容详解
1. 顶级Feed信息
Rome库通过SyndFeed对象解析整个RSS源的基本信息:
SyndFeed feed = input.build(new XmlReader(feedUrl));
// 基本信息
String title = feed.getTitle(); // 标题
String description = feed.getDescription(); // 描述
String link = feed.getLink(); // 链接
String language = feed.getLanguage(); // 语言
Date publishedDate = feed.getPublishedDate(); // 发布日期
String copyright = feed.getCopyright(); // 版权信息
String author = feed.getAuthor(); // 作者
String feedType = feed.getFeedType(); // 源类型(RSS_0.9, RSS_1.0, RSS_2.0, ATOM_0.3, ATOM_1.0等)
// 图片信息
SyndImage image = feed.getImage();
if (image != null) {
String imageUrl = image.getUrl(); // 图片URL
String imageTitle = image.getTitle(); // 图片标题
String imageLink = image.getLink(); // 图片链接
}
// 分类信息
List<SyndCategory> categories = feed.getCategories();
for (SyndCategory category : categories) {
String categoryName = category.getName(); // 分类名称
String taxonomyUri = category.getTaxonomyUri(); // 分类URI
}2. 条目信息
Rome库通过SyndEntry对象解析每个RSS条目的详细信息:
List<SyndEntry> entries = feed.getEntries();
for (SyndEntry entry : entries) {
// 基本信息
String entryTitle = entry.getTitle(); // 标题
String entryLink = entry.getLink(); // 链接
Date entryPublishedDate = entry.getPublishedDate(); // 发布日期
Date entryUpdatedDate = entry.getUpdatedDate(); // 更新日期
String entryAuthor = entry.getAuthor(); // 作者
String entryUri = entry.getUri(); // 唯一标识符(GUID)
// 描述信息
SyndContent description = entry.getDescription();
if (description != null) {
String descriptionType = description.getType(); // 内容类型(text/plain, text/html等)
String descriptionValue = description.getValue(); // 内容值
}
// 完整内容
List<SyndContent> contents = entry.getContents();
for (SyndContent content : contents) {
String contentType = content.getType(); // 内容类型
String contentValue = content.getValue(); // 内容值
String contentMode = content.getMode(); // 内容模式
}
// 分类信息
List<SyndCategory> entryCategories = entry.getCategories();
for (SyndCategory category : entryCategories) {
String categoryName = category.getName(); // 分类名称
String taxonomyUri = category.getTaxonomyUri(); // 分类URI
}
// 附件信息(图片、音频、视频等)
List<SyndEnclosure> enclosures = entry.getEnclosures();
for (SyndEnclosure enclosure : enclosures) {
String enclosureUrl = enclosure.getUrl(); // 附件URL
String enclosureType = enclosure.getType(); // 附件类型(image/jpeg, audio/mpeg等)
long enclosureLength = enclosure.getLength(); // 附件大小(字节)
}
// 源信息
SyndFeed entrySource = entry.getSource();
if (entrySource != null) {
String sourceTitle = entrySource.getTitle(); // 源标题
String sourceLink = entrySource.getLink(); // 源链接
}
}3. 扩展模块
Rome库还支持解析RSS和Atom的各种扩展模块:
// Dublin Core模块(提供标准化的元数据)
DCModule dcModule = (DCModule) entry.getModule(DCModule.URI);
if (dcModule != null) {
String creator = dcModule.getCreator(); // 创建者
List<String> subjects = dcModule.getSubjects(); // 主题
Date date = dcModule.getDate(); // 日期
}
// Content模块(提供完整内容)
ContentModule contentModule = (ContentModule) entry.getModule(ContentModule.URI);
if (contentModule != null) {
String encodedContent = contentModule.getEncoded(); // 完整HTML内容
}
// iTunes模块(针对播客)
ITunes iTunesModule = (ITunes) entry.getModule(ITunes.URI);
if (iTunesModule != null) {
String author = iTunesModule.getAuthor(); // 作者
String summary = iTunesModule.getSummary(); // 摘要
String duration = iTunesModule.getDuration(); // 时长
String image = iTunesModule.getImage(); // 图片
}
// Media RSS模块(针对多媒体内容)
MediaEntryModule mediaModule = (MediaEntryModule) entry.getModule(MediaModule.URI);
if (mediaModule != null) {
MediaContent[] mediaContents = mediaModule.getMediaContents();
for (MediaContent mediaContent : mediaContents) {
String url = mediaContent.getReference().toString(); // 媒体URL
String type = mediaContent.getType(); // 媒体类型
int width = mediaContent.getWidth(); // 宽度
int height = mediaContent.getHeight(); // 高度
}
MediaThumbnail[] thumbnails = mediaModule.getMetadata().getThumbnail();
for (MediaThumbnail thumbnail : thumbnails) {
String thumbUrl = thumbnail.getUrl().toString(); // 缩略图URL
int thumbWidth = thumbnail.getWidth(); // 缩略图宽度
int thumbHeight = thumbnail.getHeight(); // 缩略图高度
}
}Rome库API详细介绍
1. SyndFeedInput
SyndFeedInput是Rome库中用于解析RSS/Atom源的主要类。
// 创建SyndFeedInput实例
SyndFeedInput input = new SyndFeedInput();
// 配置选项
input.setAllowDoctypes(false); // 是否允许DOCTYPE声明
input.setPreserveWireFeed(true); // 是否保留原始格式信息
input.setXmlHealerOn(true); // 是否修复损坏的XML
// 从URL解析Feed
SyndFeed feed = input.build(new XmlReader(new URL("http://example.com/rss")));
// 从文件解析Feed
SyndFeed feed = input.build(new XmlReader(new File("feed.xml")));
// 从字符串解析Feed
SyndFeed feed = input.build(new StringReader(xmlString));2. SyndFeed
SyndFeed表示整个RSS/Atom源的信息。
// 获取基本信息
String title = feed.getTitle(); // 获取标题
feed.setTitle("New Title"); // 设置标题
String description = feed.getDescription(); // 获取描述
feed.setDescription("New Description"); // 设置描述
String link = feed.getLink(); // 获取链接
feed.setLink("http://example.com"); // 设置链接
Date pubDate = feed.getPublishedDate(); // 获取发布日期
feed.setPublishedDate(new Date()); // 设置发布日期
// 获取和设置条目
List<SyndEntry> entries = feed.getEntries(); // 获取所有条目
feed.setEntries(newEntries); // 设置条目列表
// 获取和设置图片
SyndImage image = feed.getImage(); // 获取图片
feed.setImage(newImage); // 设置图片
// 获取和设置分类
List<SyndCategory> categories = feed.getCategories(); // 获取分类
feed.setCategories(newCategories); // 设置分类
// 获取和设置作者
String author = feed.getAuthor(); // 获取作者
feed.setAuthor("New Author"); // 设置作者
// 获取和设置版权信息
String copyright = feed.getCopyright(); // 获取版权信息
feed.setCopyright("Copyright 2023"); // 设置版权信息3. SyndEntry
SyndEntry表示RSS/Atom源中的单个条目。
// 创建新条目
SyndEntry entry = new SyndEntryImpl();
// 设置基本信息
entry.setTitle("Entry Title"); // 设置标题
entry.setLink("http://example.com/article"); // 设置链接
entry.setPublishedDate(new Date()); // 设置发布日期
entry.setUpdatedDate(new Date()); // 设置更新日期
entry.setAuthor("Author Name"); // 设置作者
entry.setUri("http://example.com/unique-id"); // 设置唯一标识符
// 设置描述
SyndContent description = new SyndContentImpl();
description.setType("text/html");
description.setValue("<p>Article description</p>");
entry.setDescription(description);
// 添加完整内容
SyndContent content = new SyndContentImpl();
content.setType("text/html");
content.setValue("<p>Full article content</p>");
List<SyndContent> contents = new ArrayList<>();
contents.add(content);
entry.setContents(contents);
// 添加分类
SyndCategory category = new SyndCategoryImpl();
category.setName("Technology");
List<SyndCategory> categories = new ArrayList<>();
categories.add(category);
entry.setCategories(categories);
// 添加附件
SyndEnclosure enclosure = new SyndEnclosureImpl();
enclosure.setUrl("http://example.com/image.jpg");
enclosure.setType("image/jpeg");
enclosure.setLength(12345);
List<SyndEnclosure> enclosures = new ArrayList<>();
enclosures.add(enclosure);
entry.setEnclosures(enclosures);4. SyndContent
SyndContent表示内容块,如描述或完整内容。
// 创建内容
SyndContent content = new SyndContentImpl();
// 设置内容类型
content.setType("text/html"); // HTML内容
// 或
content.setType("text/plain"); // 纯文本内容
// 设置内容值
content.setValue("<p>This is HTML content</p>");
// 设置内容模式
content.setMode("escaped"); // 内容已转义5. SyndEnclosure
SyndEnclosure表示附件,如图片、音频或视频。
// 创建附件
SyndEnclosure enclosure = new SyndEnclosureImpl();
// 设置URL
enclosure.setUrl("http://example.com/image.jpg");
// 设置MIME类型
enclosure.setType("image/jpeg"); // 图片
// 或
enclosure.setType("audio/mpeg"); // 音频
// 或
enclosure.setType("video/mp4"); // 视频
// 设置大小(字节)
enclosure.setLength(12345);