2010-12-12 2 views
1

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

START_TAG <image>@2:1252 in [email protected] 
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 [email protected] 
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 тега) или если это некоторая особенность синтаксического анализатора, которую я могу настроить для выполнения этой работы, или если я собираюсь сделать это неправильно. Любая помощь/совет/руководство будут оценены.

ответ

0

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

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

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

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

http://evecal.appspot.com/feedParser

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

feedLink: URL ответа RSS Feed: JSON или XML в качестве формата ответа

Примеры:

Для запроса POST

локон --data-UrlEncode «feedLink = HTTP: //feeds.bbci.co.uk/news/world/rss.xml»--data-UrlEncode "ответ = JSON" http://evecal.appspot.com/feedParser

Для запроса GET

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

Мое приложение для Android «NewsSpeak» также использует это.