对不同的RSS供稿使用自定义的特定解析器

问题描述

我正在使用ROME库读取Java的RSS Feed

在这种情况下,我有多个RSS Feed(均具有2.0版),并且每个Feed具有其自己的结构和自定义标签。我在官方文档中读到,我们在阅读提要时可以指定a custom parser

我已经实现了自定义解析器,并在 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);
   }

}

然后,您可以为该Feed类型定义一个Converter。

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 feed。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...