问题描述
在这种情况下,我有多个RSS Feed(均具有2.0版),并且每个Feed具有其自己的结构和自定义标签。我在官方文档中读到,我们在阅读提要时可以指定a custom parser。
我已经实现了自定义解析器,并在 rome.properties 中指定了该解析器,并且效果很好。
下一步,我的目标是为我正在阅读的每个供稿指定一个自定义解析器,以避免使用又长又复杂的解析器。
但是在文档中看来,属性文件中定义的自定义解析器更适合用于不同的RSS版本,而不是用于不同的XML结构。
此属性中定义的所有类都必须实现com.rometools.rome.io.WireFeedParser接口。解析器实例必须是线程安全的。 getType()方法的返回值用作主键。如果有多个解析器返回相同的类型,则以后者为准。
我需要知道是否有一种方法(或没有方法)用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。