3

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

谢谢。

4

2 回答 2

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 Parser implementation classes
#
WireFeedParser.classes=com.example.CustomParser
于 2015-05-26T15:24:15.310 回答
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() ); 
    }       
于 2017-08-03T08:05:40.847 回答