java - 为不同的 RSS 提要使用自定义的特定解析器
问题描述
我正在使用 ROME 库通过 Java 读取 RSS 提要。
我的情况是,我有多个 RSS 提要(全部为 2.0 版本),每个提要都有自己的结构和自定义标签。我在官方文档中读到,我们可以在阅读提要时指定自定义解析器。
我已经实现了一个自定义解析器并在rome.properties中指定了这个解析器,它工作正常。
我下一步的目标是为我正在阅读的每个提要指定一个自定义解析器,以避免使用冗长而复杂的解析器。
但在文档中显示,在属性文件中定义的自定义解析器更适用于不同的 RSS 版本,而不是不同的 XML 结构。
此属性中定义的所有类都必须实现 com.rometools.rome.io.WireFeedParser 接口。解析器实例必须是线程安全的。getType() 方法的返回值用作主键。如果多个解析器返回相同的类型,则以后者为准。
这里的getType()
方法指向rss版本
我需要知道是否有办法(或没有)用 ROME 为不同的提要指定不同的自定义解析器。
解决方案
通过为我的每个自定义解析器定义不同的提要类型并覆盖isMyType
以检查 RSS 提要的源链接或标题来完成这项工作。
public class FooParser extends RSS20Parser {
public FooParser() { super("foo_rss_2.0"); }
@Override
public boolean isMyType(Document document) {
return super.isMyType(document) && isFoo(document);
}
}
然后,您可以为该提要类型定义一个转换器。
public class FooConverter extends ConverterForRSS20 {
public FooConverter() { super("foo_rss_2.0"); }
}
您需要同时注册rome.properties
WireFeedParser.classes=FooParser
Converter.classes=FooConverter
不知何故,我还重新排序了插件的加载方式rome
。我发现我可以通过重新添加RSS20Parser
到“额外插件”文件中来做到这一点。
WireFeedParser.classes=FooParser \
com.rometools.rome.io.impl.RSS20Parser
Converter.classes=FooConverter \
com.rometools.rome.feed.synd.impl.ConverterForRSS20
如果您不这样做,RSS20Parser
将用于您的所有 RSS 2.0 提要。
推荐阅读
- css - CSS 覆盖和屏幕混合模式在手机和笔记本电脑上看起来不同
- php - 使用 PHP Traits 在存储前修改数据
- ruby-on-rails - 无法将架构迁移到 Rails 中的远程 AWS RDS Postgres DB
- wordpress - Wordpress ACF Google 地图字段 API 密钥
- java - 改造从android studio中的本地存储中获取数据
- html - 如何获得对象拟合:在 Internet Explorer 上工作的封面
- azure - 来自 Syslog 的 Azure SIEM 数据格式
- powershell - 为什么使用 Start-MpScan 在 Powershell 中扫描单个文件比使用上下文菜单选项花费更长的时间?
- iphone - 使用某些插件后,使用 Cordova 在 iOS13 上更改了屏幕尺寸
- javascript - 如何将两个不同函数的总和求和成一个新函数?