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);