0

0

如何使用Java解析并生成RSS订阅源_XML操作与Syndication API应用

P粉602998670

P粉602998670

发布时间:2026-03-16 10:51:59

|

309人浏览过

|

来源于php中文网

原创

Java 11+需手动添加Jakarta XML Bind依赖,Java 8–10需注意命名空间声明;推荐使用Rome库解析/生成RSS,避免JAXB移除、DTD加载、时区格式等问题。

如何使用java解析并生成rss订阅源_xml操作与syndication api应用

Java里用javax.xml.bind解析RSS会直接报错

Java 11+ 默认移除了 jaxb-api,所以哪怕你写了 JAXBContext.newInstance(RSS.class),运行时大概率抛 ClassNotFoundException: javax.xml.bind.JAXBContext。这不是代码写错了,是JDK把这堆类踢出去了。

实操建议:

  • 如果用 Java 8–10:照常用 JAXBContext + Unmarshaller,但注意 RSS 的命名空间(xmlns:dc="http://purl.org/dc/elements/1.1/")得在类上用 @XmlSchema@XmlElement 显式声明,否则字段为空
  • 如果用 Java 11 及以上:必须手动加依赖,Maven 写清楚版本:
    <dependency>
      <groupId>jakarta.xml.bind</groupId>
      <artifactId>jakarta.xml.bind-api</artifactId>
      <version>4.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>4.0.3</version>
    </dependency>
  • 别用 javax.xml.parsers.DocumentBuilder 手动遍历 DOM 解析 RSS——字段多、命名空间杂、日期格式不统一,三天都调不完

Rome库生成RSS比原生API快十倍还稳

Rome 是专为 Syndication 设计的库,封装了 RSS/Atom 全部变体(rss_2.0atom_1.0、甚至 rss_0.91),不用自己硬扛 <pubDate><dc:date> 的时间格式转换。

常见错误现象:生成的 XML 在 Feedly 或 Inoreader 里显示“无效源”,多半是 <channel><lastBuildDate><item> 里没填 <guid>(即使 RSS 2.0 不强制,但现代阅读器默认校验)。

立即学习Java免费学习笔记(深入)”;

实操建议:

  • 创建 SyndFeed 后必须设 feed.setFeedType("rss_2.0"),不设默认是 rss_0.91,会导致 <content:encoded> 被忽略
  • SyndEntrysetUri() 对应 <guid>,别用 setTitle() 混着填;setPublishedDate()java.util.Date 即可,Rome 自动转 RFC 822 格式
  • 要支持 dc:creator,得先 feed.setModule(new DCModuleImpl()),再往 entry 里加 DCModule 实例,不能只靠注解

DocumentBuilder 解析 RSS 时遇到 EntityResolver 报错

典型错误信息:java.io.FileNotFoundException: http://cyber.law.harvard.edu/rss/rss.html —— 这不是网络问题,是 RSS 文件开头的 DTD 声明触发了默认的外部实体加载,而那个 URL 早已失效。

iMuse.AI
iMuse.AI

iMuse.AI 创意助理,为设计师提供无限灵感!

下载

根本原因:JDK 的 DocumentBuilder 默认开启 setExpandEntityReferences(true),一碰到 <!DOCTYPE rss SYSTEM "http://cyber.law.harvard.edu/rss/rss.html"> 就去远程抓取。

实操建议:

  • 必须禁用外部 DTD 加载:
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    // 或兼容老 JDK:
    factory.setValidating(false);
    factory.setNamespaceAware(true);
  • 如果非要用 DOM 解析(比如要提取 <media:thumbnail> 这种非标准扩展),记得调用 document.getDocumentElement().getElementsByTagNameNS("*", "thumbnail"),别用无命名空间的 getElementsByTagName
  • 别信“用 InputSource 包一层字符串就能绕过 DTD”——只要 XML 字符串含 DOCTYPEDocumentBuilder 照样报错

RSS 时间字段的时区处理最容易漏掉

RSS 规范要求 <pubDate> 用 RFC 822 格式(如 Wed, 05 Oct 2022 14:30:00 +0800),但 Java 的 SimpleDateFormat 默认不带时区偏移,ZonedDateTime 转出来的却是 ISO 8601 格式,阅读器直接当无效时间丢弃。

实操建议:

  • 生成时用 new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US),注意 Locale.US 控制英文缩写(Wed, Oct),否则中文系统下输出 星期三 就废了
  • 解析时别用 SimpleDateFormat 直接 parse——RFC 822 有多个变体(+0000GMTUTC),Rome 库内部用 javax.mail.internet.MailDateFormat 处理更可靠
  • 如果后端时间存的是 UTC,生成前务必调用 date.setTime(date.getTime() + TimeZone.getDefault().getOffset(date.getTime())) 补本地偏移——RSS 不接受纯 UTC 时间,必须带 +0800 这种显式标记

真正麻烦的从来不是读写 XML,而是 RSS 那些“理论上可选、实际上必填”的字段,还有阅读器厂商各自加的私有扩展。与其反复试错,不如从第一天就用 Rome,把精力留给内容逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1950

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1175

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

90

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.4万人学习

Java 教程
Java 教程

共578课时 | 82.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号