RSS Feed中的ROME API解析CDATA中的图像URL

时间:2019-01-22 02:34:58

标签: java rss rome

如果在CDATA部分中指定了URL,则罗马API不会解析图像URL。 例如,http://www.espn.com/espn/rss/espnu/news此供稿具有

    <image>
    <![CDATA[
   URL of the image
    ]]>
    </image>

在SyndFeedInput生成的SyndFeed中,我已经检查了外部标记,附件,DCModules。

CDATA中也提供了其他元素的

值,例如Description和Title,Rome API能够解析这些值。

代码段

XmlReader xmlReader = null;
        try {
            xmlReader = new XmlReader(new URL("http://www.espn.com/espn/rss/espnu/news"));
            SyndFeedInput input = new SyndFeedInput();
            SyndFeed feed = input.build(xmlReader);
        } catch (Exception e) {
            e.printStackTrace();
        } 

1 个答案:

答案 0 :(得分:0)

我详细研究了API。 API提供了用于覆盖解析的插件 https://rometools.github.io/rome/RssAndAtOMUtilitiEsROMEV0.5AndAboveTutorialsAndArticles/RssAndAtOMUtilitiEsROMEPluginsMechanism.html

我写了一个扩展RSS20Parser的类,该类实现了WireFeedParser并覆盖了parseItem方法

    @Override
        public Item parseItem(Element rssRoot, Element eItem, Locale locale) {
            Item item =  super.parseItem(rssRoot, eItem, locale);

            Element imageElement = eItem.getChild("image", getRSSNamespace());
            if (imageElement != null) {
                String imageUrl = imageElement.getText();

                Element urlElement = imageElement.getChild("url");

if(urlElement != null)
{
imageUrl = urlElement.getText();
}    
                Enclosure e = new Enclosure();
                e.setType("image");
                e.setUrl(imageUrl);
                item.getEnclosures().add(e);
            }

            return item;
        }

现在在SyndFeed中,访问附件列表,您将能够找到图像URL

List<SyndEntry> entries = feed.getEntries();
        for (SyndEntry entry : entries) {
...
...
    List<SyndEnclosure> enclosures = entry.getEnclosures();
                if(enclosures!=null) {
                    for(SyndEnclosure enclosure : enclosures) {
                        if(enclosure.getType()!=null && enclosure.getType().equals("image")){
                            System.out.println("image URL : "+enclosure.getUrl());
                        }
                    }
                }
}

并创建rome.properties文件,该文件可通过以下条目在类路径中访问

WireFeedParser.classes=your.package.name.CustomRomeRssParser