IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Récupération de flux RSS qui ne s'exécute pas correctement.


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Par défaut Récupération de flux RSS qui ne s'exécute pas correctement.
    Bonjour !

    Je suis entrain de travailler sur une application qui récupère le flux RSS d'un site et le parse pour en extraire les news. Rien de bien compliqué donc, mais j'ai un soucis avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    url = new URL("URL DU FLUX RSS DU SITE VERIFIEE");
    
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    
    Document doc;
    			
    db = dbf.newDocumentBuilder();
    			
    doc = db.parse(new InputSource(url.openStream()));
    doc.getDocumentElement().normalize();
    NodeList nodeList = doc.getElementsByTagName("item");
    Parfois ce code et la suite fonctionnent mais la plupart du temps l'appel de ces méthodes plante, surtout à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doc = db.parse(new InputSource(url.openStream()));
    Et je n'arrive pas à déterminer pourquoi.

    Auriez vous quelques idées ?

    Merci d'avance !

    EDIT : l'URL du flux RSS est bien vérifié et fonctionne parfaitement avec d'autres agrégateurs de news.

    EDIT 2 : Je viens de rajouter les catch qui vont bien, et il semblerait que l'erreur vienne du parser SAX, à la ligne où je fais le db.parse.

  2. #2
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 55
    Par défaut
    Je travaille actuellement sur un projet de lecture de flux rss.

    J'ai remarqué le soucis que tu présentes et ai eu beaucoup de mal à le résoudre, car en fait, cela ne vient pas du parser, mais du url.openStream (url.getContent()) pour moi. (mais l'exception vient bien du SAXParser comme toi)

    Pour vérifier si c'est le même soucis ou non, déjà regarde si le problème vient des flux rss qui contiennent des <!--[CDATA] alors, le soucis est le même que moi.

    Il faudrait alors générer un InputStream de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HttpGet httpget = new HttpGet("URL du fichier XML");
    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response=httpclient.execute(httpget);
    InputStream input = response.getEntity().getContent();
    Ensuite, si cela ne vient pas de là, pourrais-tu nous en dire plus sur le contenu du Log, en faire un copier/coller par ex de toutes les lignes de l'exception.

  3. #3
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 55
    Par défaut
    Pour te donner le code complet, voici (c'est encore temporaire pour l'objet Tag, mais ça fonctionne plutôt bien, avec quelques méthodes utiles pour la suite dans cet objet si ça peut te servir):

    Méthode me retournant un objet Tag (le InputStream en argument est généré via le code du message précédent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    	private static Tag getData(InputStream file){
    		SAXParserFactory fabrique = SAXParserFactory.newInstance();
    		SAXParser parseur = null;
    		Tag datas = null;
    		try {
    			parseur = fabrique.newSAXParser();
    		} catch (ParserConfigurationException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
     
    		DefaultHandler handler = new ParserXMLHandler();
    		try {
    			parseur.parse(file, handler);
    			datas = ((ParserXMLHandler) handler).getData();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return datas;
    	}
    Maintenant, mon objet Tag :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    public class Tag{
    	public String localName = new String("");
    	public String value = new String("");
    	public List<Tag> children = new ArrayList<Tag>();
    	public Map<String, String> attributes = new HashMap<String, String>();
     
    	public List<Tag> getChildrenByLocalName(String localName, boolean includeSubChild){
    		List<Tag> returnedValue = new ArrayList<Tag>();
    		for(Tag child : this.children){
    			if(child.localName == localName){
    				returnedValue.add(child);
    			}
    			if(includeSubChild){
    				List<Tag> fromChild = child.getChildrenByLocalName(localName, includeSubChild);
    				returnedValue.addAll(fromChild);
    			}
    		}
    		return returnedValue;
    	}
    	public Tag getFirstChildByLocalName(String localName, boolean includeSubChild){
    		return (this.getChildrenByLocalName(localName, includeSubChild).size() >= 1) ? this.getChildrenByLocalName(localName, includeSubChild).get(0) : null;
    	}
     
    }
    Et, je me sers également d'un SAXParser, que j'ai adapté de cet excellent tutorial (http://thibault-koprowski.fr/2010/10...-sous-android/) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import java.util.HashMap;
    import java.util.Map;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    public class ParserXMLHandler extends DefaultHandler {
    	private Tag xmlDocument;
    	private Map<Integer, Tag> tagPile = new HashMap<Integer, Tag>();
    	private Integer currentLevel = 0;
    	private StringBuffer buffer;
     
    	@Override
    	public void processingInstruction(String target, String data) throws SAXException {
    		super.processingInstruction(target, data);
    	}
    	public ParserXMLHandler() {
    		super();
    	}
     
    	@Override
    	public void startDocument() throws SAXException {
    		super.startDocument();
    		xmlDocument = new Tag();
    	}
     
    	@Override
    	public void startElement(String uri, String localName, String name,	Attributes attributes) throws SAXException {
    		buffer = new StringBuffer();
    		Tag currentTag = new Tag();
    		currentTag.localName = localName;
    		for(int i = 0; i < attributes.getLength(); i++){
    			currentTag.attributes.put(attributes.getLocalName(i), attributes.getValue(i));
    		}
    		tagPile.put(this.currentLevel, currentTag);
    		this.currentLevel++;
    	}
    	@Override
    	public void endElement(String uri, String localName, String name) throws SAXException {
    		currentLevel--;
    		int parentLevel = currentLevel - 1;
    		if(parentLevel >= 0){
    			Tag currentTag = tagPile.get(currentLevel);
    			if(buffer != null)
    				currentTag.value = buffer.toString();
     
    			Tag parentTag = tagPile.get(parentLevel);
     
    			parentTag.children.add(currentTag);
     
    			tagPile.remove(parentTag);
    			tagPile.remove(currentTag);
     
    			tagPile.put(parentLevel, parentTag);
     
    			buffer=null;
    		}else{
    			xmlDocument = tagPile.get(currentLevel);
    		}
    	}
     
    	public void characters(char[] ch,int start, int length)	throws SAXException{
    		String lecture = new String(ch,start,length);
    		if(buffer != null) buffer.append(lecture);
    	}
     
    	public Tag getData(){
    		return xmlDocument;
    	}
    }
    En espérant que ça puisse aider...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Par défaut
    Merci pour ta réponse !

    J'ai testé en utilisant le code de ton premier message en générant un inputStream, mais rien à faire, voici l'exception dans le log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    org.xml.sax.SAXParseException: unterminated entity ref (position:ENTITY_REF &@88:37 in java.io.InputStreamReader@44ee23c0) 
    at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:151)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:157)
    at model.Parser.parse(Parser.java:62)
    at view.Comicsblog_AppActivity.remplirTitles(Comicsblog_AppActivity.java:95)
    at view.Comicsblog_AppActivity.onCreate(Comicsblog_AppActivity.java:78)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4363)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    at dalvik.system.NativeStart.main(Native Method)
    J'utilise un parser fait par un collègue, moins propre que le tiens, mais qui fonctionne bien (il l'utilise dans une application sans problème) mais je vais quand même tenter de changer celui-ci. Mais c'est bizarre que parfois j'arrive à récupérer les news en lançant l'application alors que la plupart du temps ça ne fonctionne pas.

  5. #5
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 55
    Par défaut
    Excuse-moi, pourrais-tu, en même temps qu'afficher le log d'erreur, faire un copier/coller du fichier XML.

    Non pas que je mette en doute le fichier XML, mais voir où le soucis se pose aidera probablement

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Par défaut
    Il peut se trouver à cette adresse : www.comicsblog.fr/comicsblog.rss

    Il y a un problème d'encodage des balises HTML apparemment mais ça fonctionne quand même et elles sont bien interprétées par la webview que j'utilise.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2015, 09h27
  2. Récupération info flux rss
    Par Kerweb dans le forum Langage
    Réponses: 6
    Dernier message: 24/09/2008, 15h22
  3. [DOM XML] Page de flux RSS qui ne s'affiche pas
    Par JackBeauregard dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 04/05/2008, 11h16
  4. Flux RSS qui met pas l'heure correctement
    Par jojo15320 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/08/2007, 11h21
  5. [RegEx] Récupération infos flux rss / atom via ereg()
    Par Fab le Fou dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2006, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo