2010-10-29 10 views

Répondre

5

J'utilise le lib xmlpull_1_1_3_4c.jar et par exemple lire les flux Twitter (rss) comme ci-dessous.

XML Pull est une source ouverte. Vous avez juste besoin d'ajuster les tags en fonction de votre flux. Si vous ne pouvez pas trouver le pot en ligne, je peux vous l'envoyer par courriel. Je ne me souviens pas d'où je l'ai eu, c'était sur xmlpull.org, mais je ne sais pas où c'est maintenant. Je l'ai quelque part liée de http://www.ibm.com/developerworks/opensource/library/x-android/

import org.developerworks.android.FeedParser; 
import org.developerworks.android.FeedParserFactory; 
import org.developerworks.android.Message; 
import org.developerworks.android.ParserType; 
import org.xmlpull.v1.XmlSerializer; 

.... 
loadFeed(ParserType.ANDROID_SAX); 
.... 



private void loadFeed(ParserType type){ 
    try{ 
     Log.i("AndroidNews", "ParserType="+type.name()); 
     FeedParser parser = FeedParserFactory.getParser(type); 
     long start = System.currentTimeMillis(); 
     messages = parser.parse(); 
     long duration = System.currentTimeMillis() - start; 
     String xml = writeXml();  
     titles = new ArrayList<String>(messages.size()); 
     for (Message msg : messages){ 
     titles.add(msg.getTitle()); 
     } 
    } catch (Throwable t){ 
     Log.e("AndroidNews",t.getMessage(),t); 
    } 
    } 

private String writeXml() { 


XmlSerializer serializer = Xml.newSerializer(); 
    StringWriter writer = new StringWriter(); 
    try { 
    serializer.setOutput(writer); 
    serializer.startDocument("UTF-8", true); 
    serializer.startTag("", "messages"); 
    serializer.attribute("", "number", String.valueOf(messages.size())); 
    for (Message msg: messages){ 
    serializer.startTag("", "message"); 
    serializer.attribute("", "date", msg.getDate()); 
    serializer.startTag("", "title"); 
    serializer.text(msg.getTitle()); 
    serializer.endTag("", "title"); 
    serializer.startTag("", "url"); 
    serializer.text(msg.getLink().toExternalForm()); 
    serializer.endTag("", "url"); 
    serializer.startTag("", "body"); 
    serializer.text(msg.getDescription()); 
    serializer.endTag("", "body"); 
    serializer.endTag("", "message"); 
    } 
    serializer.endTag("", "messages"); 
    serializer.endDocument(); 
    return writer.toString(); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 

Edit:

C'est la classe entière qui renseigne les aliments à une vue de la liste, en utilisant un ArrayAdapter, il n'y a pas le curseur sur une base de données si, depuis Je ne stocke pas les flux localement:

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Html; 
import android.util.Log; 
import android.util.Xml; 
import android.view.Gravity; 
import android.view.View; 
import android.widget.*; 
import org.developerworks.android.FeedParser; 
import org.developerworks.android.FeedParserFactory; 
import org.developerworks.android.Message; 
import org.developerworks.android.ParserType; 
import org.xmlpull.v1.XmlSerializer; 

import java.io.StringWriter; 
import java.util.ArrayList; 
import java.util.List; 

public class Twitter extends BaseActivity implements 
     AdapterView.OnItemClickListener { 

    private List<Message> messages; 
    private List<String> titles; 

    //TweetsAdapter ta = new TweetsAdapter(this); 
    public ListView lstTweets = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.twitter); 

     // set header title 
     ((TextView)findViewById(R.id.txtHeaderTitle)).setText(Html.fromHtml("<b>" + getResources().getString(R.string.activity_title_twitter) +"</b>")); 

     // highlight icon 
     ImageButton btn = (ImageButton)findViewById(R.id.btnTwitter); 
     btn.setBackgroundResource(R.drawable.menu_icon_twitter_active); 

     // load list of tweets 
     lstTweets = (ListView)findViewById(R.id.lstTweets); 
     lstTweets.setOnItemClickListener(this); 

     new AsyncTask<Void, Void, Void>() { 

      ProgressDialog p; 
      boolean success = false; 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       p.dismiss(); 
       if (!success) { 

        Twitter.this.runOnUiThread(new Runnable() { 
         public void run() { 
          Toast toast = Toast.makeText(Twitter.this, "Sorry, could not connect to Twitter.", Toast.LENGTH_LONG); 
          toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0); 
          toast.show(); 
         } 
        }); 

       } else { 
        ArrayAdapter<String> adapter = 
         new ArrayAdapter<String>(Twitter.this, R.layout.twitter_list_row,titles); 
        lstTweets.setAdapter(adapter); 
       } 
      } 

      @Override 
      protected void onPreExecute() { 
       p = ProgressDialog.show(Twitter.this,"Loading...","...please wait a moment."); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        loadFeed(ParserType.ANDROID_SAX); 
        if (messages!=null&&messages.size()>0) success = true; 
       } catch (RuntimeException e) {} 
       catch (Exception e) {} 
       return null; 
      } 
     }.execute(); 



    } 


    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
    Intent viewMessage = new Intent(Intent.ACTION_VIEW, 
    Uri.parse(messages.get(position).getLink().toExternalForm())); 
    this.startActivity(viewMessage); 
    } 


private void loadFeed(ParserType type){ 
    try{ 
     Log.i("AndroidNews", "ParserType="+type.name()); 
     FeedParser parser = FeedParserFactory.getParser(type); 
     long start = System.currentTimeMillis(); 
     messages = parser.parse(); 
     long duration = System.currentTimeMillis() - start; 
     String xml = writeXml();  
     titles = new ArrayList<String>(messages.size()); 
     for (Message msg : messages){ 
     titles.add(msg.getTitle()); 
     } 
    } catch (Throwable t){ 
     Log.e("AndroidNews",t.getMessage(),t); 
    } 
    } 

    private String writeXml(){ 
    XmlSerializer serializer = Xml.newSerializer(); 
    StringWriter writer = new StringWriter(); 
    try { 
    serializer.setOutput(writer); 
    serializer.startDocument("UTF-8", true); 
    serializer.startTag("", "messages"); 
    serializer.attribute("", "number", String.valueOf(messages.size())); 
    for (Message msg: messages){ 
    serializer.startTag("", "message"); 
    serializer.attribute("", "date", msg.getDate()); 
    serializer.startTag("", "title"); 
    serializer.text(msg.getTitle()); 
    serializer.endTag("", "title"); 
    serializer.startTag("", "url"); 
    serializer.text(msg.getLink().toExternalForm()); 
    serializer.endTag("", "url"); 
    serializer.startTag("", "body"); 
    serializer.text(msg.getDescription()); 
    serializer.endTag("", "body"); 
    serializer.endTag("", "message"); 
    } 
    serializer.endTag("", "messages"); 
    serializer.endDocument(); 
    return writer.toString(); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 
} 
+0

Je suppose que c'est l'URL: http://www.extreme.indiana.edu/xgws/xsoap/xpp/. Pouvez-vous expliquer plus en détail ce que nous devons vraiment faire ici. Aussi pouvez-vous faire la lumière sur l'autre réponse qui implique 4 étapes (réponse de DavLink? Merci –

+0

quel est votre cas d'utilisation? Avez-vous vraiment besoin de stocker les nouvelles dans une base de données localement? Dans mon application par exemple, je montre juste les flux twitter dans une listview sans les stocker, donc les étapes 3,4 sont optionnelles je dirais, en fonction de votre utilisation.Vous avez besoin des nouvelles persistantes/disponibles hors ligne aussi? –

+0

voir la réponse éditée avec un exemple de classe entière comment montrer les flux dans –

3

Ce n'est pas simple à implémenter.

Un fichier RSS est un fichier XML dont la structure est conforme à une norme (noms de points fixes).

Dans votre application, vous devez:

  • Télécharger le flux RSS: utiliser HttpClient, services ...
  • Extrait les données sur XML: utiliser un analyseur XML, certains sont fournis
  • stocker les données: la meilleure solution est une base de données SQLite
  • Afficher les données: ListView avec CursorAdapter pointant vers la base de données
+0

ok! Donc, il y a 4 étapes là-bas. Je peux réussir les trois dernières étapes. Dites-moi à propos du premier. Comment puis-je télécharger un flux RSS dans Android? –

+0

Fait le! :) J'ai les flux en cours de téléchargement et d'avoir enregistré dans un fichier de base de données. J'ai une question ici: Que fait cette méthode Xml.parse (this.getInputStream(), Xml.Encoding.ISO_8859_1, root.getContentHandler()); Vous pouvez regarder la classe AndroidSaxFeedParser.java. Bravo –

1

DavLink, a raison. L'analyse RSS n'est pas triviale.

Il est assez facile de configurer une implémentation d'un analyseur syntaxique SAX, mais le plus difficile est de pouvoir analyser tous les flux sous le soleil.

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.

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. Après avoir obtenu vos informations, vous pouvez utiliser une simple liste avec un tableauadapter ayant votre tableau d'éléments.