在Android中使用命名空间处理RSS源

时间:2010-04-23 15:41:59

标签: android rss namespaces xml-namespaces

我正在尝试编写一个带有RSS提要和XML的XML解析器。获取<media:thumbnail>标记的url属性中显示的图片网址。这一切都是通过android.Util.Xml和&amp;是the code shown here的改编。我尝试使用的示例RSS提要是BBC News RSS feed

然而,媒体是一个额外的名称空间&amp; (可能)因此我的解析器不能正常工作。

我的解析方法的一个版本如下。有没有(毫无疑问是简单的)方法让我的图片网址列表有效?

public List<string> parse() {
    URL feedUrl = new URL("http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml");

    InputStream feedStream;

    try {
        feedStream = feedUrl.openConnection().getInputStream();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }              

    final List<string> ret = new ArrayList<string>();

    RootElement root = new RootElement("rss");
    Element channel = root.getChild("channel");
    Element item = channel.getChild("item");

    item.getChild("media", "thumbnail").getChild("url").setEndTextElementListener(new EndTextElementListener() {
        public void end(String body) {
            ret.add(body);
        }
    });

    try {
        Xml.parse(feedStream, Xml.Encoding.UTF_8, root.getContentHandler());
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return ret;
}

3 个答案:

答案 0 :(得分:5)

我发现Xml解析器(在Froyo 2.2上)与名称空间前缀一起使用的一种方法是将名称空间URL指定为item.getChild()调用的第一个参数。例如,如果您的xml看起来像这样,您的代码可以使用xmlns url作为第一个参数。

<?xml version="1.0" encoding="utf-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sample="http://www.example_web_site_here.com/dtds/sample_schema.dtd" version="2.0">
    <channel><item><sample:duration>1:00:00</sample:duration></item></channel></rss>

您的侦听器设置如下所示,以获取持续时间元素文本:

 item.getChild("http://www.example_web_site_here.com/dtds/sample_schema.dtd", "duration").setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                this.itemDuration = body;
            } });

它需要知道命名空间,但它一直在为我工作。就我而言,我知道名称空间。

答案 1 :(得分:0)

据我所知,“android”SAX解析器不支持命名空间(xmlns)嵌套(尽管rootelement对象特别提到了命名空间),剥离的“J2SE”SAX解析器也在路上瘫痪了, DOM解析器很重,但可以运行。

我使用DOM和XML命名空间成功,但更喜欢SAX解决方案,它不涉及在我的包中添加像JDOM这样的工作XML库。

答案 2 :(得分:0)

我不建议尝试实现自己的RSS解析器,而是使用标准库。

您需要迎合所有格式RSS 1,RSS 2,Atom等。即使这样,您也必须应对格式不佳的Feed。

我过去遇到过类似的问题所以决定在服务器上进行feed解析,然后获取解析后的内容。这允许我运行更复杂的库和解析器,我可以修改它而不会推出我的应用程序的更新。你必须真正的目标是保持你的应用程序轻量级,并尽可能多地推动它(对你自己的后端服务器)。

我在AppEngine上运行了以下服务,它允许在您的末尾进行更简单的XML / JSON解析。响应有一个固定而简单的结构。您可以使用它来解析

http://evecal.appspot.com/feedParser

您可以使用以下参数发送POST和GET请求。

feedLink:RSS提要响应的URL:JSON或XML作为响应格式

示例:

对于POST请求

curl --data-urlencode“feedLink = http://feeds.bbci.co.uk/news/world/rss.xml”--data-urlencode“response = json”http://evecal.appspot.com/feedParser

对于GET请求

evecal.appspot.com/feedParser?feedLink=http://feeds.nytimes.com/nyt/rss/HomePage&response=xml

我的Android应用程序“NewsSpeak”也使用它。