2010-12-12 3 views
1

Je travaille sur un lecteur RSS très simple pour Android comme une expérience d'apprentissage. J'ai décidé d'utiliser le XmlPullParser pour analyser les flux car il est assez simple et a un niveau d'efficacité acceptable (pour mes besoins). J'obtiens une erreur en essayant d'analyser mon flux de test (rss.slashdot.org/slashdot/slashdot) que je n'arrive pas à résoudre malgré le fait de chercher des réponses sur le Web. L'erreur (de l'éclipse) est:Android Pull Parsing RSS flux problèmes

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: 

Le fichier en question est:

<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/" /> 
    ... 

si l'erreur semble se produire à la balise FeedBurner.

enfin, mon code est:

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(); 
     } 
    } 

Je ne sais pas vraiment s'il y a un moyen d'ignorer cela (car à ce stade, je ne me soucie pas de l'étiquette feedburner) ou si est une caractéristique de l'analyseur que je peux définir pour faire ce travail, ou si je vais à ce sujet dans le mauvais sens. Toute aide/conseil/orientation serait appréciée.

Répondre

0

PullParsing est plus efficace que SAX. Mais à mon avis, il reste encore beaucoup à faire pour que votre flux RSS soit capable d'analyser tous les flux là-bas.

Vous devez répondre à tous les formats RSS 1, RSS 2, Atom, etc. Même dans ce cas, vous aurez à composer avec des flux mal formatés. J'avais déjà rencontré des problèmes similaires dans le passé et j'ai donc décidé de faire mon analyse de flux sur un serveur et d'obtenir simplement le contenu analysé. Cela me permet d'exécuter des bibliothèques et des analyseurs plus complexes que je peux modifier sans mettre à jour les mises à jour de mon application. Vous devriez regarder les options côté serveur afin que vous puissiez garder votre application légère et simple.

Le service suivant est en cours d'exécution sur AppEngine, ce qui permet un traitement XML/JSON beaucoup plus simple. Il y a une structure fixe et simple à la réponse. Vous pouvez l'utiliser pour l'analyse syntaxique

http://evecal.appspot.com/feedParser

Vous pouvez envoyer à la fois POST et GET demandes avec les paramètres suivants.

feedLink: L'URL de la réponse de flux RSS: JSON ou XML comme format de réponse

Exemples:

Pour une requête POST

boucle --data-urlencode « feedLink = http: //feeds.bbci.co.uk/news/world/rss.xml » --data-urlencode "réponse = JSON" http://evecal.appspot.com/feedParser

Pour toute demande GET

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

Mon application Android "NewsSpeak" l'utilise aussi.