Проблемы с RSS-потоками в Android Pull Parsing

Я работаю над очень простой программой чтения RSS для Android в качестве обучающего материала. Я решил использовать XmlPullParser для анализа фидов, поскольку он довольно прост и имеет приемлемый уровень эффективности (для моих нужд). Я получаю сообщение об ошибке при попытке синтаксического анализа моего тестового канала (rss.slashdot.org/slashdot/slashdot), которую я не могу решить, несмотря на поиск ответов в Интернете. Ошибка (от затмения):

START_TAG <image>@2:1252 in java.io.InputStreamReader@43e7a488
START_TAG (empty) <{http://www.w3.org/2005/Atom}atom10:link rel='self' type='application/rss+xml' href='http://rss.slashdot.org/Slashdot/slashdot'>@2:1517 in java.io.InputStreamReader@43e7a488
DEBUG/JRSS(313): java.net.MalformedURLException: Protocol not found:

Рассматриваемый файл:

<image>
    ...
</image>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://rss.slashdot.org/Slashdot/slashdot" />
<feedburner:info uri="slashdot/slashdot" />
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
    ...

поэтому ошибка возникает в теге feedburner.

наконец, мой код:

public class XmlHelper
{
    private XmlPullParserFactory factory;
    private XmlPullParser xpp;
    private final int START_TAG = XmlPullParser.START_TAG;

    // Debugging Tag
    private final String TAG = "JRSS";

    // for channels and items
    private final String TITLE = "title";
    private final String LINK = "link";
    private final String DESCRIPTION = "description";
    private final String PUBDATE = "pubDate";

    // element keys for channel
    private final String LANGUAGE = "language";
    private final String IMAGE = "image";
    private final String ITEM = "item";

    // for items
    private final String AUTHOR = "author";

    // for images
    private final String URL = "url";
    private final String WIDTH = "width";
    private final String HEIGHT = "height";

    public XmlHelper(Context context)
    {
        try
    {
        factory = XmlPullParserFactory.newInstance();
    }
    catch (XmlPullParserException e)
    {
        Log.d(TAG, e.toString());
    }
        factory.setNamespaceAware(true);
    }

    public Channel addFeed(URL url) throws XmlPullParserException, IOException
    {       
        Channel c = new Channel();
        c.items = new ArrayList<Item>();

        xpp = factory.newPullParser();
        xpp.setInput(url.openStream(), null);

        // move past rss element
        xpp.nextTag();
        // move past channel element
        xpp.nextTag();

        while(xpp.nextTag() == START_TAG)
        {
            Log.d(TAG, xpp.getPositionDescription());

            if(xpp.getName().equals(TITLE))
                c.title = xpp.nextText();

            else if(xpp.getName().equals(LINK))
                c.url = new URL(xpp.nextText());

            else if(xpp.getName().equals(DESCRIPTION))
                c.description = xpp.nextText();

            else if(xpp.getName().equals(LANGUAGE))
                c.language = xpp.nextText();

            else if(xpp.getName().equals(ITEM))
            {
                Item i = parseItem(xpp);
                c.items.add(i);
            }

            else if(xpp.getName().equals(IMAGE))
            {
                parseImage(xpp);
            }

            else
                xpp.nextText();
        }

        return c;
    }

    public Item parseItem(XmlPullParser xpp) throws MalformedURLException, XmlPullParserException, IOException
    {
    Item i = new Item();

    while(xpp.nextTag() == START_TAG)
    {
            // do nothing for now
        xpp.nextText();
    }

        return i;
    }

    private void parseImage(XmlPullParser xpp) throws XmlPullParserException, IOException
    {
        // do nothing for now
        while(xpp.nextTag() == START_TAG)
        {
            xpp.nextText();
        }
    }

Я действительно не знаю, есть ли способ просто проигнорировать это (потому что на данный момент меня не волнует тег feedburner), или есть ли какая-то функция синтаксического анализатора, которую я могу настроить для этой работы, или если Я ошибаюсь. Любая помощь / совет / руководство будут оценены.


person user539648    schedule 12.12.2010    source источник


Ответы (1)


PullParsing более эффективен, чем SAX. Но, на мой взгляд, еще многое нужно сделать для того, чтобы ваш RSS-канал мог анализировать любые существующие каналы.

Вам необходимо обслуживать все форматы RSS 1, RSS 2, Atom и т. Д. Даже в этом случае вам придется бороться с плохо отформатированными потоками.

Раньше я сталкивался с подобными проблемами, поэтому решил выполнить синтаксический анализ ленты на сервере и просто получить проанализированное содержимое. Это позволяет мне запускать более сложные библиотеки и синтаксический анализатор, которые я могу изменять, не отправляя обновления для моего приложения. Вам следует рассмотреть варианты на стороне сервера, чтобы ваше приложение оставалось легким и простым.

У меня есть следующая служба, работающая на AppEngine, которая позволяет намного упростить синтаксический анализ XML / JSON на вашей стороне. У ответа есть фиксированная и простая структура. Вы можете использовать это для разбора

http://evecal.appspot.com/feedParser

Вы можете отправлять запросы POST и GET со следующими параметрами.

feedLink: URL-адрес ответа RSS-канала: 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" тоже использует это.

person VNVN    schedule 13.02.2011