使用Rome API解析自定义rss标记

时间:2013-08-09 19:24:23

标签: rss rss-reader rome

我正在尝试使用Rome解析一些rss feed。其中一个RSS提要说 指定0.91作为版本,并且未定义自定义xml命名空间,但条目中仍包含自定义元素。我可以使用罗马来解析没有任何已定义的命名空间的自定义标签吗?

感谢。

2 个答案:

答案 0 :(得分:3)

是。你需要编写一个自定义解析器来完成它。

我们假设您要处理元素customStringcustomDate。首先扩展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的解析器。

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

答案 1 :(得分: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的解析器。

# 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() ); 
    }