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 :

Encodage sous SAX


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Par défaut Encodage sous SAX
    Bonjour

    Je consomme un flux xml de météo de google avec sax pour une application de météo.

    Le problème que mon sax ne veux pas des accents dans le fichier xml fourni par google <<http://www.google.com/ig/api?weather=paris&hl=fr>>
    voila a quoi ressemble le fichier xml
    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
     
    <xml_api_reply version="1">
    <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
    <forecast_information>
    <city data="Paris, Île-de-France"/>
    <postal_code data="paris"/>
    <latitude_e6 data=""/>
    <longitude_e6 data=""/>
    <forecast_date data="2012-07-28"/>
    <current_date_time data="1970-01-01 00:00:00 +0000"/>
    <unit_system data="SI"/>
    </forecast_information>
    <current_conditions>
    <condition data="Ciel nuageux"/>
    <temp_f data="66"/>
    <temp_c data="19"/>
    <humidity data="Humidité : 94 %"/>
    <icon data="/ig/images/weather/cloudy.gif"/>
    <wind_condition data="Vent : O à 13 km/h"/>
    </current_conditions>
    <forecast_conditions>
    <day_of_week data="sam."/>
    <low data="15"/>
    <high data="26"/>
    <icon data="/ig/images/weather/chance_of_storm.gif"/>
    <condition data="Risques de tempête"/>
    </forecast_conditions>
    <forecast_conditions>
    <day_of_week data="dim."/>
    <low data="15"/>
    <high data="22"/>
    <icon data="/ig/images/weather/mostly_sunny.gif"/>
    <condition data="Ensoleillé dans l'ensemble"/>
    </forecast_conditions>
    <forecast_conditions>
    <day_of_week data="lun."/>
    <low data="16"/>
    <high data="21"/>
    <icon data="/ig/images/weather/mostly_sunny.gif"/>
    <condition data="Partiellement ensoleillé"/>
    </forecast_conditions>
    <forecast_conditions>
    <day_of_week data="mar."/>
    <low data="18"/>
    <high data="27"/>
    <icon data="/ig/images/weather/mostly_sunny.gif"/>
    <condition data="Partiellement ensoleillé"/>
    </forecast_conditions>
    </weather>
    </xml_api_reply>
    voila le code de mon conteneur de donné

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    package com.icozz.meteo;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
     
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
     
    import org.w3c.dom.ProcessingInstruction;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    import android.content.Context;
    import android.util.Log;
     
    public class ContenuData {	
     
    	static public Context context;
     
    	public ContenuData() {
     
    	}
     
    	public static ArrayList getFeeds()
    	{
    		// On passe par une classe factory pour obtenir une instance de sax
    		SAXParserFactory fabrique = SAXParserFactory.newInstance();
    		SAXParser parseur = null;
    		ArrayList entries = null;
    		try {
    			// On "fabrique" une instance de SAXParser
    			parseur = fabrique.newSAXParser();
    		} 
    		catch (ParserConfigurationException e) 
    		{
    			e.printStackTrace();
    		} 
    		catch (SAXException e) 
    		{
    			e.printStackTrace();
    		}
     
    		// On défini l'url du fichier XML
    		URL url = null;
    		try {
    			url = new URL("http://www.google.com/ig/api?weather=paris&hl=fr");
    		} 
    		catch (MalformedURLException e1) 
    		{
    			e1.printStackTrace();
    		}
     
    		/*
    		 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui qui sera chargé
    		 * des opérations de parsing. On vera cette classe en détails ci après.
    		*/
    		DefaultHandler handler = new ParseurXml();		
     
    		try {
    			// On parse le fichier XML
    			InputStream input = url.openStream();
    			if(input==null)
    				Log.i("erreur android","Probléme dans url");
    			else
    			{
    				parseur.parse(input, handler);
    				// On récupère directement la liste des feeds
    				entries = ((ParseurXml) handler).getData();
    			}
    		} catch (SAXException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		// On la retourne l'array list
    		return entries;
    	}
     
    }
    Comment je peux faire pour remédier a ce problème

    Cordialement

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    J'utilise un parser SAX avec tout plein de XML en UTF-8, je n'ai aucun problème de caractère accentué.

    Quel est le problème ? Est-ce que c'est l'affichage, avec des &eacute;, ce type de chose ? Le parsing qui plante ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre très actif
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Par défaut
    Merci de me rependre
    L'application donne des erreur les voila
    Quant j’utilise sa http://www.google.com/ig/api?weather=rabat&hl=fr
    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
     
    07-28 14:49:52.217: I/je suis dans(641): StartDocument
    07-28 14:49:52.246: W/System.err(641): org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 539: not well-formed (invalid token)
    07-28 14:49:52.256: W/System.err(641): 	at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:520)
    07-28 14:49:52.256: W/System.err(641): 	at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:479)
    07-28 14:49:52.256: W/System.err(641): 	at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:318)
    07-28 14:49:52.256: W/System.err(641): 	at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275)
    07-28 14:49:52.267: W/System.err(641): 	at javax.xml.parsers.SAXParser.parse(SAXParser.java:390)
    07-28 14:49:52.267: W/System.err(641): 	at javax.xml.parsers.SAXParser.parse(SAXParser.java:187)
    07-28 14:49:52.267: W/System.err(641): 	at com.icozz.meteo.ContenuData.getFeeds(ContenuData.java:71)
    07-28 14:49:52.267: W/System.err(641): 	at com.icozz.meteo.MeteoActivity.onCreate(MeteoActivity.java:23)
    07-28 14:49:52.267: W/System.err(641): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    07-28 14:49:52.267: W/System.err(641): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    07-28 14:49:52.277: W/System.err(641): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    07-28 14:49:52.277: W/System.err(641): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    07-28 14:49:52.277: W/System.err(641): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    07-28 14:49:52.277: W/System.err(641): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    07-28 14:49:52.277: W/System.err(641): 	at android.os.Looper.loop(Looper.java:123)
    07-28 14:49:52.286: W/System.err(641): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
    07-28 14:49:52.286: W/System.err(641): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-28 14:49:52.286: W/System.err(641): 	at java.lang.reflect.Method.invoke(Method.java:507)
    07-28 14:49:52.296: W/System.err(641): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-28 14:49:52.296: W/System.err(641): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-28 14:49:52.296: W/System.err(641): 	at dalvik.system.NativeStart.main(Native Method)
    07-28 14:49:52.317: D/AndroidRuntime(641): Shutting down VM
    07-28 14:49:52.317: W/dalvikvm(641): threadid=1: thread exiting with uncaught exception (group=0x40015560)
    07-28 14:49:52.336: E/AndroidRuntime(641): FATAL EXCEPTION: main
    07-28 14:49:52.336: E/AndroidRuntime(641): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.icozz.meteo/com.icozz.meteo.MeteoActivity}: java.lang.NullPointerException
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.os.Looper.loop(Looper.java:123)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at java.lang.reflect.Method.invoke(Method.java:507)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at dalvik.system.NativeStart.main(Native Method)
    07-28 14:49:52.336: E/AndroidRuntime(641): Caused by: java.lang.NullPointerException
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at com.icozz.meteo.MeteoActivity.onCreate(MeteoActivity.java:25)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    07-28 14:49:52.336: E/AndroidRuntime(641): 	... 11 more
    Mais quant je utilise http://www.google.com/ig/api?weather=rabat&hl=en

    Sa marche bien :s

    Cordialement,

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Déjà il y a trop de "catch" d'exceptions silencieuses dans ton code (avec en prime des "printStackTrace" qui n'arrange rien)....

    En général on n'a jamais dans la même fonctions plusieurs try/catch à la suite... ils sont au pire imbriqués....
    Voici pourquoi:

    Que se passe-t-il si fabrique.newSAXParser(); lance une exception ?
    On passe dans un "catch", avec un printStackTrace (préférer Log.e("MONAPP","Erreur ici",ex); plutot que ex.printStackTrace())... et... on continue ! (exception catchée, et passée sous silence).
    Du coup on continue (avec parseur à null) jusqu'à parseur.parse(input, handler); ... et bim NullPointerException ! (non catchée pour le coup et tant mieux, donc crash de l'appli).

    Vu la fonction dans le meilleur des cas, elle retourne "null" sans rien dire à l'appelant (ni à l'utilisateur) sur la raison du null ! Ou un NullPointerException qui cache l'exception originelle.

    Concernant le problème d'accents... je ne vois pas pourquoi cela ne marcherait pas....

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Même problème, même solution que pour un article dans la section Général Java / XML : http://www.developpez.net/forums/d12...dage-flux-xml/

    Quoique c'est encore plus simple. SAXParser.parse() accepte de prendre l'URI du document à parser, au lieu d'un InputStream. Il suffit de faire ça : il saura se débrouiller tout seul pour retrouver le charset dans les headers HTTP.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Encodage sous windows
    Par nuts62 dans le forum Général Java
    Réponses: 3
    Dernier message: 26/10/2010, 15h01
  2. Problème d'encodage sous Windows / Linux
    Par robert_trudel dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/09/2009, 17h30
  3. [Utilisation] Probleme encodage sous windows
    Par tittoto dans le forum Subversion
    Réponses: 2
    Dernier message: 28/05/2007, 09h44
  4. Sauvegarde xls sous Sax Basic
    Par el_pilacho dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/10/2006, 17h04
  5. problème d'encodage sous Firefox
    Par marsupix dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2006, 22h14

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