如何解析RSS Feed并将其显示为Blackberry Application中的链接?

时间:2010-03-13 14:13:15

标签: blackberry rss parsing

我想解析xml提要并在我的Blackberry应用程序中显示为链接。

谷歌搜索后,我发现我必须使用SAX解析器。我没有找到任何好的例子。

例如,如果我想从bbc.co.uk解析新闻rss feed。怎么做。如何从rss feed中提取图像。

请帮助,建议和指导我。 SIA 感谢

1 个答案:

答案 0 :(得分:7)

让我们说它的twitter rss xml我们正在谈论:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" 
  xmlns:georss="http://www.georss.org/georss">
  <channel>
    <title>Twitter / LPProjekt</title>
    <link>http://twitter.com/LPProjekt</link>
    <atom:link type="application/rss+xml" 
      href="http://twitter.com/statuses/user_timeline/27756405.rss" rel="self"/>
    <description>Twitter updates from Linkin Park Projekt</description>
    <language>en-us</language>
    <ttl>40</ttl>
  <item>
    <title>LPProjekt: the instrumental from &quot;what ive done&quot;</title>
    <description>LPProjekt: the instrumental from &quot;</description>
    <pubDate>Sun, 07 Feb 2010 23:34:26 +0000</pubDate>
    <guid>http://twitter.com/LPProjekt/statuses/8784251683</guid>
    <link>http://twitter.com/LPProjekt/statuses/8784251683</link>
  </item>
..
  </channel>
</rss>

首先为你的xml实现处理程序,取&lt;标题&gt;和&lt;链接&gt;值来自&lt; item&gt;只有:

class RSSHandler extends DefaultHandler {
    boolean isItem = false;
    boolean isTitle = false;
    boolean isLink = false;
    String[] title = new String[] {};
    String[] link = new String[] {};
    String value = "";

    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        if (!isItem) {
            if (name.equalsIgnoreCase("item"))
                isItem = true;
        } else {
            if (name.equalsIgnoreCase("title"))
                isTitle = true;
            if (name.equalsIgnoreCase("link"))
                isLink = true;
        }
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if (isTitle || isLink)
            value = value.concat(new String(ch, start, length));
    }

    public void endElement(String uri, String localName, String name)
            throws SAXException {
        if (isItem && name.equalsIgnoreCase("item"))
            isItem = false;
        if (isTitle && name.equalsIgnoreCase("title")) {
            isTitle = false;
            Arrays.add(title, value);
            value = "";
        }
        if (isLink && name.equalsIgnoreCase("link")) {
            isLink = false;
            Arrays.add(link, value);
            value = "";
        }
    }
}

现在,要使用它,从HttpConnection获取InputStream并将其全部放在SAXParser.parse中:

static String[][] getURLFromRSS(String url) {
        InputStream is = null;
        HttpConnection connection = null;
        RSSHandler rssHandler = new RSSHandler();
        try {
            connection = (HttpConnection) Connector.open(url);
            is = connection.openInputStream();
            try {
                SAXParser parser = SAXParserFactory.newInstance()
                        .newSAXParser();
                parser.parse(is, rssHandler);
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null)
                    is.close();
                if (connection != null)
                    connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String[][] result = new String[2][];
        result[0] = rssHandler.title;
        result[1] = rssHandler.link;
        return result;
    }

现在使用自定义LabelField作为链接字段:

class LinkLabel extends LabelField
{
    String mUrl = "";
    public LinkLabel(String title, String url) {
        super(title, FOCUSABLE);
        mUrl = url;
    }
    protected boolean navigationClick(int status, int time) {
        Browser.getDefaultSession().displayPage(mUrl);
        return true;
    }
}

使用样本:

public Scr() {
    String rssUrl = "http://twitter.com/statuses/user_timeline/27756405.rss";
    String[][] urlData = getURLFromRSS(rssUrl);
    for (int i = 0; i < urlData.length; i++) {
        String title = urlData[0][i];
        String url = urlData[1][i];
        add(new LinkLabel(title, url));
    }
}

alt text http://img215.imageshack.us/img215/7583/rssurl.jpg