ROME API URL-адрес для анализа изображения в CDATA из RSS-канала - PullRequest
0 голосов
/ 22 января 2019

Рим API не анализирует URL-адрес изображения, если он указан в разделе CDATA.Например, http://www.espn.com/espn/rss/espnu/news этот канал имеет

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

В SyndFeed, полученном из SyndFeedInput, я проверил ForeignMarkups, вложений, DCModules.

значение других элементов, таких какОписание и заголовок также приведены в CDATA, и 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 голосов
/ 22 января 2019

Я посмотрел на 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, который доступен в classpath со следующей записью

WireFeedParser.classes=your.package.name.CustomRomeRssParser
...