首页 > 解决方案 > 为不同的 RSS 提要使用自定义的特定解析器

问题描述

我正在使用 ROME 库通过 Java 读取 RSS 提要。

我的情况是,我有多个 RSS 提要(全部为 2.0 版本),每个提要都有自己的结构和自定义标签。我在官方文档中读到,我们可以在阅读提要时指定自定义解析器。

我已经实现了一个自定义解析器并在rome.properties中指定了这个解析器,它工作正常。

我下一步的目标是为我正在阅读的每个提要指定一个自定义解析器,以避免使用冗长而复杂的解析器。

但在文档中显示,在属性文件中定义的自定义解析器更适用于不同的 RSS 版本,而不是不同的 XML 结构。

此属性中定义的所有类都必须实现 com.rometools.rome.io.WireFeedParser 接口。解析器实例必须是线程安全的。getType() 方法的返回值用作主键。如果多个解析器返回相同的类型,则以后者为准。

这里的getType()方法指向rss版本

我需要知道是否有办法(或没有)用 ROME 为不同的提要指定不同的自定义解析器。

标签: javarssfeedrome

解决方案


通过为我的每个自定义解析器定义不同的提要类型并覆盖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 提要。


推荐阅读