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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    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 régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 55
    Points : 83
    Points
    83
    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 régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 55
    Points : 83
    Points
    83
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    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 régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 55
    Points : 83
    Points
    83
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    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.

  7. #7
    Membre actif Avatar de chpil
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 143
    Points : 212
    Points
    212
    Par défaut
    Ton document XML (le flux RSS) est mal formé, c'est pourquoi le parsing génère une erreur.
    Il y a dans ton XML un délimiteur d'entité XML non terminée correctement (c'est d'ailleurs ce qu'indiquait l'exception)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <title>Preview - Quelques pages pour Daredevil, Punisher, Avenging & Amazing Spider-Man</title>
    Le caractère & ne peut apparaître seul dans un document XML; c'est un délimiteur d'entité, qui permet d'encoder des caractères spéciaux servant au langage XML
    Dans ton cas, il devrait être remplacé par &amp;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <title>Preview - Quelques pages pour Daredevil, Punisher, Avenging &amp; Amazing Spider-Man</title>

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Ah d'accord, merci je vois.
    Mais je ne peux pas modifier le flux RSS, y aurait-il un moyen de remplacer & par &amp; au moment de parser ?

  9. #9
    Membre actif Avatar de chpil
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 143
    Points : 212
    Points
    212
    Par défaut
    Faudrait le remplacer avant de parser. Tâche assez ardue à mon avis, car il ne faut remplacer qu'à bon escient, vu que le caractère & est largement présent dans le flux XML, et qu'il ne faudrait traiter que les occurrences qui ne correspondent pas à une instance d'entité XML valide
    Le plus simple serait quand même d'avoir un flux XML valide. Ne peux tu pas voir avec le producteur du RSS ?

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Ok, ba j'ai commencé à prendre contact avec l'équipe du site, je vais voir ce que je peux faire. Et puis ce serait trop couteux j'imagine avec une expression régulière qui parcourait tout mon XML pour remplacer les "&" posant problème.

    Merci de votre aide à tous les deux !

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