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 :

Erreur d'un parsing xml pour extraire une liste


Sujet :

Android

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut Erreur d'un parsing xml pour extraire une liste
    Bonjour à tous,

    J'essaie en vain de résoudre mon problème, mais sans succès. Surtout que je ne comprends pas d'où vient l'erreur.

    Voici mon 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
    <compounds>
        <compound name="alkene">
            <product>Alkane</product>
    		<product>Alcohol</product>
    		<product>Halogenoalkane</product>
    		<product>Epoxide</product>
    		<product>Diol</product>
        </compound>
     
        <compound name="alkyne">
            <product>Alkane</product>
    		<product>Alkene</product>
    		<product>Aldehyde/Ketone</product>
    		<product>Halogenoalkane</product>
    		<product>Carboxylic acid</product>
        </compound>
    </compounds>
    J'ai suivi ce tuto qui marche très bien pour un autre parsing.

    Mon objectif est que pour chaque "compound", je puisse extraire une liste de "product" associés.
    J'ai donc créer un bean Compound
    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
    public class Compound {
     
    	private String name;
    	private ArrayList<String> products;
     
    	public Compound() {
    		super();
    	}
     
    	public Compound(String name, ArrayList<String> products) {
    		super();
    		this.name = name;
    		this.products = products;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public ArrayList<String> getProducts() {
    		return products;
    	}
     
    	public void setProducts(ArrayList<String> products) {
    		this.products = products;
    	}
    }
    et le Handler
    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
    package com.turvy.organicreaction.xml;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    import android.util.Log;
     
    import com.turvy.organicreaction.beans.Compound;
     
    public class XmlCompoundHandler extends DefaultHandler {
     
    	private List<Compound> compounds;
    	private String tempVal;
    	private Compound tempCompound;
    	private ArrayList<String> products;
     
    	// constructor
    	public XmlCompoundHandler() {
    		compounds = new ArrayList<Compound>();
    		;
    	}
     
    	public List<Compound> getCompounds() {
    		return compounds;
    	}
     
    	// start of the XML document
    	public void startDocument() {
    		Log.i("XmlCompoundHandler", "Start of XML document");
    	}
     
    	// end of the XML document
    	public void endDocument() {
    		Log.i("XmlCompoundHandler", "End of XML document");
    	}
     
    	// opening element tag
    	public void startElement(String uri, String name, String qName,
    			Attributes atts) {
    		// reset
    		tempVal = "";
    		// find out if the element is a brand
    		if (qName.equalsIgnoreCase("compound")) {
     
    			// create a new instance of compound
    			tempCompound = new Compound();
    			tempCompound.setName(atts.getValue("name"));
    		}
    	}
     
    	// closing element tag
    	public void endElement(String uri, String localName, String qName)
    			throws SAXException {
    		if (qName.equalsIgnoreCase("compound")) {
    			// add it to the list
    			compounds.add(tempCompound);
    		} else if (qName.equalsIgnoreCase("product")) {
    			products.add(tempVal);
    			tempCompound.setProducts(products);
    		}
    	}
     
    	// element content
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		tempVal = new String(ch, start, length);
    	}
    }
    Je n'ajoute pas le parser ni l'activité car ils ne sont pas en cause.

    Le problème semble se situer au niveau de la méthode endElement puisque si j'omets le "else if (qName.equalsIgnoreCase("product")) {***}", alors ma liste de "Compound" est bien créée comme il faut. Dans le cas contraire, rien n'est fait et j'ai alors un NullPointerException dans mon activité.

    J'aimerais donc savoir comment résoudre le problème et pourquoi problème il y a.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    A aucun moment tu n'a initialisé ta variable products. Donc forcément, dur dur d'y appeler une méthode add

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Le temps perdu juste pour ca. En tout cas, merci, ca a résolu ce problème. Mais du coup j'ai pu en découvrir d'autres, dont un que je ne comprends pas encore.

    1er problème : la liste "products" rajoutait les nouveaux "product" à l'ancienne. Un simple products.clear() dans la méthode startElement a suffit.

    2eme problème : la création de la nouvelle liste "products" associée à Alkyne, remplace la première liste "products" associée à Alkene.
    Pour les 2 "Compound", j'ai donc les mêmes listes "products". Et ca, je ne comprends pas comment c'est possible puisque on recrée un nouvel élément "Compound" dans la méthode starElement.

    Une solution s'il vous plait ?

  4. #4
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Parce que tu te mélanges les pinceaux avec les références...

    quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tempCompound.setProducts(products);
    tu dis que la liste de produits de l'objet "tempCompound" *est* "products".
    Puis ensuite tu la vides (elle sera donc vide)
    Puis tu la re-remplis (elle sera re-remplit avec le contenu du deuxième compound).
    Et quand tu fais le deuxième setProducts... tu as deux compounds, qui pointent tous deux sur la même liste de produits: "products".

    Hint:
    Utiliser le code suivant pour Compound:
    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
     
    public class Compound {
     
    	private String name;
    	private ArrayList<String> products = new ArrayList<String>();
     
    	public Compound() {
    		super();
    	}
     
    	public Compound(String name, ArrayList<String> products) {
    		super();
    		this.name = name;
    		this.products = products;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
            /** On utilise Collection au lieu de "List" pour d'une part permettre une utilisation plus pratique, genre "for (String p : compound.getProducts())" et cacher l'implémentation en ArrayList. */
    	public Collection<String> getProducts() {
    		return this.products;
    	}
     
            /** Pareil il suffit que la source soit une "collection", pas obligatoirement une "array-list" */
    	public void setProducts(Collection<String> products) {
    		this.products.clear();
                    this.products.addAll(products);
    	}
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Merci pour la soluce, ca marche nickel. J'aurais jamais pensé changer les setters pour résoudre l'erreur.

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

Discussions similaires

  1. Probleme timer pour extraire une sequence d'une webcam
    Par howimboe dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/09/2008, 18h01
  2. mapping d'un fichier xml pour générer une base SQL
    Par annir dans le forum XQUERY/SGBD
    Réponses: 1
    Dernier message: 09/09/2008, 09h32
  3. Comment extraire du xml pour faire une bdd avec php?
    Par baleiney dans le forum XQUERY/SGBD
    Réponses: 9
    Dernier message: 09/03/2008, 14h55
  4. Réponses: 5
    Dernier message: 04/07/2007, 18h31
  5. Erreur pour charger une liste
    Par minie dans le forum Struts 1
    Réponses: 9
    Dernier message: 01/06/2007, 10h16

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