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 :

Lecture d'un Asset XML avec SAX


Sujet :

Android

  1. #1
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut Lecture d'un Asset XML avec SAX
    Bonjour à tous (et au passage bonnes fêtes!),

    J'ai fait une petite application récemment en Java/Swing, et je souhaitais faire une nouvelle interface pour Android tout en gardant le coeur "calculatoire" déjà existant. Je créé donc un nouveau projet et me sert de l'existant en dépendance.
    Je m'appuie sur des fichiers XML pour définir certaines des données nécessaires à mon application, et si je les lis sans problème avec Java "normal", sous Android, ça coince un peu.

    Dans mon activity principale, je créé les inputstream de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Map<String,InputStream> files = new HashMap<String,InputStream>();
    		try {
     
    			files.put("Fichier1", getAssets().open("Fichier1.xml"));
    			files.put("Fichier2", getAssets().open("Fichier2.xml"));
    			files.put("Fichier3", getAssets().open("Fichier3.xml"));
     
    		} catch (IOException e) {
    			// ...
    		}
     
     
            CardMaker.createCardList(files);
    Le maker s'appuie sur un parseur SAX :

    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
     
    	public static void createCardList(Map<String,InputStream> files){
    		// TODO : Transfer to Model for DAO
    		SAXParserFactory fabrique = SAXParserFactory.newInstance();
    		SAXParser parseur;
     
     
    		try {
    			parseur = fabrique.newSAXParser();
    			CardHandler gestionnaire = new CardHandler();
    			parseur.parse(files.get("Fichier1"), gestionnaire);
    			Card.oneCards = gestionnaire.getCards();
     
    			gestionnaire = new CardHandler();
    			parseur.parse(files.get("Fichier2"), gestionnaire);
    			Card.twoCards = gestionnaire.getCards();
     
    			gestionnaire = new CardHandler();
    			parseur.parse(files.get("Fichier3"), gestionnaire);
    			Card.threeCards = gestionnaire.getCards();
     
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    La classe Card est un conteneur pour mes données.
    Le parseur est un parseur tout banal qui lit balise ouverture/fermeture, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
     
    		String read = new String(ch,start,length);
    		if(buffer != null){
    			buffer.append(read);
    		}
     
    	}
    Lorsque je met un point d'arrêt au niveau de la fonction characters du parseur, le ch ne contient qu'un saut de ligne, et rien d'autre là où sur l'application "normale", je retrouve tout mon fichier xml.
    Il n'y a pas de problème au niveau de la taille des fichiers (ils font 5ko max chacun), et apparemment la lecture des assets se fait puisque la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public static String readInputStreamAsString(InputStream in) 
    		    throws IOException {
     
    		    BufferedInputStream bis = new BufferedInputStream(in);
    		    ByteArrayOutputStream buf = new ByteArrayOutputStream();
    		    int result = bis.read();
    		    while(result != -1) {
    		      byte b = (byte)result;
    		      buf.write(b);
    		      result = bis.read();
    		    }        
    		    return buf.toString();
    		}
    Appelée avec le getAssets().open("file.xml"); me renvoie bien la chaine avec tout mon joli fichier...

    Donc là je coince, je soupçonne de mal m'y prendre avec les inputstream et les assets, mais où est l'erreur?? Je n'ai aucune exception nulle part, si ce n'est dans la suite du programme lorsqu'il tombe sur une recherche sur des informations désespérément vides.

    Merci d'avoir pris le temps de me lire, et merci à ceux qui pourraient éclairer ma lanterne.
    Linio

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Peux tu poster ici l'intégralité de ton parseur Sax ?

    Merci.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Je ne pense pas que l'erreur vienne du parseur vu qu'il fonctionne sans heurt avec mon application normale. A moins que la machine Dalvik n'aime pas certains trucs?

    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
     
    public class CardHandler extends DefaultHandler {
     
    	private List<Card> cards = new ArrayList<Card>();
     
    	private Card currentcard;
    	private StringBuffer buffer;
     
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
     
    		String read = new String(ch,start,length);
    		if(buffer != null){
    			buffer.append(read);
    		}
     
    	}
     
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
     
    		// Si l'élément est une nouvelle carte 'card', on créé une nouvelle carte
    		if (Constants.CARD.equals(qName)){
     
    			if (currentcard != null){
    				throw new SAXException("Votre fichier est mal formé!");
    			}
    			currentcard = new Card();
     
    		}
    		// Sinon on démarre le buffer
    		else{
    			buffer = new StringBuffer();
    		}
    	}
     
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
     
    		// Si c'est une carte on la rajoute à la liste
    		if (Constants.CARD.equals(qName)){
     
    			cards.add(currentcard);
    			currentcard = null;
     
    		}
    		// Si c'est les types, on rajoute
    		else if (Constants.TYPE.equals(qName)){
     
    			currentcard.setType(Arrays.asList(buffer.toString().split(Constants.SEPARATOR)));
    		}
    		else if (Constants.NAME.equals(qName)){
     
    			currentcard.setName(buffer.toString());
    		}
    		else if (Constants.ID.equals(qName)){
     
    			currentcard.setID(buffer.toString());
    		}		
     
    	}
     
    	public List<Card> getCards() {
    		return cards;
    	}
     
     
    }
    Linio

  4. #4
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Et donc quand tu met des points d'arret sur les balises ouvrante/fermante dans ta classe parseur, tu y arrives ou alors ton fichier est vraiment considéré comme vide par le parseur ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  5. #5
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Ah ben tiens!

    MERCI!
    Je n'avais pas pensé à tester ça.

    Quand je regarde en fait, je travaillais sur les qName, or là c'est le localName qui est "rempli".

    Je ne comprends pas, pourquoi le comportement est différent selon que je sois sous une VM normale ou sur l'autre???

    Arf, bon ben le problème vient de là "je pense" vu qu'effectivement il ne repère jamais la fin de la balise, mais je ne vois pas comment faire quelque chose d'intercompatible du coup...?
    Linio

  6. #6
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Quand tu regarde la java doc :
    localName The local name (without prefix), or the empty string if Namespace processing is not being performed.
    qName The qualified name (with prefix), or the empty string if qualified names are not available.
    donc en gros qName c'est si tu as une balise avec prefixe, et localname c'est sans le prefixe.
    Donc dans ton cas le localName devrait fonctionné sur java classique et android, non ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  7. #7
    Membre averti Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Points : 332
    Points
    332
    Par défaut
    Ben... non

    D'un côté j'ai uniquement le qname rempli, de l'autre, uniquement le localname (yeah).

    Je ne suis pas vraiment expert XML, donc je ne sais pas concrètement quelle est la bonne marche à suivre sur ce coup, apparemment il semble que l'absence de remplissage du qname sur Android soit effectivement un bug, mais à ce moment là je suppose que le localname devrait par la même être rempli de l'autre côté.

    Donc soit je m'interroge sur le pourquoi du comment, soit j'essaye de corriger de manière pas terrible... Hum...

    Enfin merci en tout cas, ça me retire une belle épine du pied.
    Linio

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture de trame xml avec SAX
    Par gillD dans le forum XML
    Réponses: 1
    Dernier message: 10/09/2007, 16h02
  2. [SAX] Je dois générer un fichier XML avec SAX
    Par moi95 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 24/01/2007, 12h22
  3. [SAX] Recuperer le resultat d"un parsing XML avec SAX
    Par chouxe dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/12/2006, 15h48
  4. [SAX] Erreur de parsing XML avec SAX
    Par philobedo dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 02/08/2006, 13h49
  5. [SAX] Java : problème de lecture d'XML avec SAX
    Par TheReturnOfMuton dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 22/06/2006, 18h26

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