2013-08-09 4 views
2

Я пытаюсь использовать Рим для разбора некоторых RSS-каналов. Один из rss-каналов говорит, что определяет версию 0.91 как версию, и не задано собственное пространство имен xml, но записи по-прежнему имеют в них собственный элемент. Могу ли я использовать Рим для анализа таких пользовательских тегов без определенного пространства имен?Разбирать пользовательские теги rss с помощью API Рима

Спасибо.

+2

Вы когда-нибудь могли решить эту проблему? – GarySharpe

ответ

3

Да. Для этого вам нужно написать собственный парсер.

Предположим, вы хотите обрабатывать элементы customString и customDate. Начните с расширения класса Item для хранения пользовательских элементов.

package com.example; 

import com.sun.syndication.feed.rss.Item; 
import java.util.Date; 

public class CustomItem extends Item { 

    private String _customString; 
    private Date _customDate; 

    public String getCustomString() { 
     return _customString; 
    } 

    public void setCustomString(String customString) { 
     _customString = customString; 
    } 

    public Date getCustomDate() { 
     return _customDate; 
    } 

    public void setCustomDate(Date customDate) { 
     _customDate = customDate; 
    } 

} 

Затем напишите парсер. Вам также нужно обрабатывать любые стандартные элементы, которые вы хотите проанализировать.

package com.example; 

import com.example.CustomItem;  
import com.sun.syndication.feed.rss.Item; 
import com.sun.syndication.io.WireFeedParser; 
import com.sun.syndication.io.impl.DateParser; 
import com.sun.syndication.io.impl.RSS091UserlandParser; 
import org.jdom.Element; 

public class CustomParser extends RSS091UserlandParser implements WireFeedParser { 

    public CustomItem parseItem(Element rssRoot, Element eItem) { 
     CustomItem customItem = new CustomItem(); 

     // Standard elements 
     Item standardItem = super.parseItem(rssRoot, eItem); 
     customItem.setTitle(standardItem.getTitle()); 
     customItem.setDescription(standardItem.getDescription()); 

     // Non-standard elements 
     Element e = eItem.getChild("customString", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomString(e.getText()); 
     } 

     e = eItem.getChild("customDate", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomDate(DateParser.parseDate(e.getText())); 
     } 

     return customItem; 
    } 

} 

Наконец, вы должны определить ваш парсер в rome.properties файл вместе с анализаторами для любого другого вида корма вы хотите обработать.

# Feed Parser implementation classes 
# 
WireFeedParser.classes=com.example.CustomParser 
+1

И как использовать этот парсер для получения моих данных? – Shams

+0

Возможно, что-то вроде этого? 'WireFeedInput input = new WireFeedInput(); Канал канала = (канал) input.build (новый XmlReader (feedUrl)); 'См. Также http://rometools.github.io/rome/HowRomeWorks/ –

+0

- это решение работает для любого? –

0

Чтобы получить данные, вам необходимо написать пользовательский конвертер.

часть кода такой же сверху.

Начните с расширения класса Item для хранения пользовательских элементов.

package com.example; 

import com.sun.syndication.feed.rss.Item; 
import java.util.Date; 

public class CustomItem extends Item { 

    private String _customString; 
    private Date _customDate; 

    public String getCustomString() { 
     return _customString; 
    } 

    public void setCustomString(String customString) { 
     _customString = customString; 
    } 

    public Date getCustomDate() { 
     return _customDate; 
    } 

    public void setCustomDate(Date customDate) { 
     _customDate = customDate; 
    } 

} 

Затем напишите парсер. Вам также нужно обрабатывать любые стандартные элементы, которые вы хотите проанализировать.

package com.example; 

import com.example.CustomItem;  
import com.sun.syndication.feed.rss.Item; 
import com.sun.syndication.io.WireFeedParser; 
import com.sun.syndication.io.impl.DateParser; 
import com.sun.syndication.io.impl.RSS091UserlandParser; 
import org.jdom.Element; 

public class CustomParser extends RSS091UserlandParser implements WireFeedParser { 

    public CustomItem parseItem(Element rssRoot, Element eItem) { 
     CustomItem customItem = new CustomItem(); 

     // Standard elements 
     Item standardItem = super.parseItem(rssRoot, eItem); 
     customItem.setTitle(standardItem.getTitle()); 
     customItem.setDescription(standardItem.getDescription()); 

     // Non-standard elements 
     Element e = eItem.getChild("customString", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomString(e.getText()); 
     } 

     e = eItem.getChild("customDate", getRSSNamespace()); 
     if (e != null) { 
      customItem.setCustomDate(DateParser.parseDate(e.getText())); 
     } 

     return customItem; 
    } 

} 

Затем напишите конвертер.

public class CustomConverter extends ConverterForRSS20 { 

     protected SyndEntry createSyndEntry(Item item) { 
      List<HashMap<String,String>> temp = new ArrayList<HashMap<String,String>>(); 
      SyndEntry syndEntry = super.createSyndEntry(item); 
      customItem customItem = (customItem)item;   

      List<String> customList = new ArrayList<String>(); 
      customList.add(customItem.getCustomString()); 
      //set to empty attribute ex foreignmarkup 
      syndEntry.setForeignMarkup(customList); 

      return syndEntry; 
     } 
} 

Наконец, вы должны определить ваш парсер в а rome.properties файл вместе с анализаторами для любого другого вида корма вы хотите обработать.

# Feed Parser implementation classes 
# 
WireFeedParser.classes=com.example.CustomParser 
# Feed Converter implementation classes 
# 
Converter.classes=com.example.CustomConverter 

Тогда вы можете получить значение.

SyndFeed feed = input.build(new XmlReader(feedUrl)); 
List<SyndEntryImpl> entrys = feed.getEntries(); 
    for(SyndEntryImpl entry:entrys){ 
     System.out.println(entry.getForeignMarkup()); 
    }