Gros probleme de lecture d'un fichier xml [Résolu]

Signaler
Messages postés
7
Date d'inscription
mercredi 13 février 2008
Statut
Membre
Dernière intervention
17 février 2010
-
Messages postés
7
Date d'inscription
mercredi 13 février 2008
Statut
Membre
Dernière intervention
17 février 2010
-
bonjour, je suis entrain de créer un programme gérant des bulletins scolaires ( le cauchemar de tous les élèves XD ).
bon voilà, toutes mes infos sont stockées dans un fichier xml, le voici :

<laClasse>
<lesMatieres>

<numMatiere>1</numMatiere>
<libMatiere><![CDATA[mathématique]]></libMatiere>
<coeffMatiere>7</coeffMatiere>

<numMatiere>2</numMatiere>
<libMatiere><![CDATA[français]]></libMatiere>
<coeffMatiere>5</coeffMatiere>

</lesMatieres>
<lesEleves>

<numEleve>3</numEleve>
<nomEleve><![CDATA[aubry]]></nomEleve>
<![CDATA[max]]>

<lesNotes>

<numNote>1</numNote>
<valeurNote>12,5</valeurNote>
<dateNote>01/05/2009</dateNote>
<coeffNote>2</coeffNote>
<numMatiereNote>1</numMatiereNote>

<numNote>2</numNote>
<valeurNote>17,25</valeurNote>
<dateNote>06/05/2009</dateNote>
<coeffNote>1</coeffNote>
<numMatiereNote>2</numMatiereNote>

</lesNotes>
<lesAppreciations>

<numAppreciation>1</numAppreciation>
<libAppreciation><![CDATA[travail convenable]]></libAppreciation>
<numMatiereAppr>1</numMatiereAppr>

<numAppreciation>2</numAppreciation>
<libAppreciation><![CDATA[travail sérieux !]]></libAppreciation>
<numMatiereAppr>2</numMatiereAppr>

</lesAppreciations>

<numEleve>4</numEleve>
<nomEleve><![CDATA[galliot]]></nomEleve>
<![CDATA[quentin]]>

<lesNotes>

<numNote>3</numNote>
<valeurNote>16,5</valeurNote>
<dateNote>01/05/2009</dateNote>
<coeffNote>2</coeffNote>
<numMatiereNote>1</numMatiereNote>

<numNote>4</numNote>
<valeurNote>18</valeurNote>
<dateNote>06/05/2009</dateNote>
<coeffNote>1</coeffNote>
<numMatiereNote>2</numMatiereNote>

</lesNotes>
<lesAppreciations>

<numAppreciation>3</numAppreciation>
<libAppreciation><![CDATA[travail convenale mais peu encore mieu faire]]></libAppreciation>
<numMatiereAppr>1</numMatiereAppr>

<numAppreciation>4</numAppreciation>
<libAppreciation><![CDATA[travail sérieux !]]></libAppreciation>
<numMatiereAppr>2</numMatiereAppr>

</lesAppreciations>

</lesEleves>
</laClasse>

bon, voilà mon probleme.
lorsque je charge mes infos dans mes classes, la gestion des notes et des appréciations est fausse.
je m'explique,
vous avez vu, j'ai 2 élèves, avec 2 notes chacun.
lorsque je regarde le résultat apres chargement, mes 2 élèves possèdent les 4 notes O_o
l'élève n°1 possède les notes n° 1, 2, 3 et 4
de meme pour l'élève n°2

et pareil pour les appréciations >_<

je vous montre le code que j'ai écris :

public void chargement_XML(ClClasseEleve uneClasse, string unFichier)
        {
            ClMatiere uneMatiere = null;
            ClEleve unEleve = null;
            ClNote uneNote = null;
            ClAppreciation uneAppreciation = null;
            ClMatiere laMatiereNote;
            ClMatiere laMatiereAppr;

            XPathDocument doc = new XPathDocument(unFichier);
            XPathNavigator nav = doc.CreateNavigator();

            // on cré les matières
            XPathNodeIterator RecMatiere = nav.Select("laClasse/lesMatieres/uneMatiere");
            while (RecMatiere.MoveNext())
            {
                string numMatiere = RecMatiere.Current.SelectSingleNode("numMatiere").Value;
                string libMatiere = RecMatiere.Current.SelectSingleNode("libMatiere").Value;
                string coeffMatiere = RecMatiere.Current.SelectSingleNode("coeffMatiere").Value;

                uneMatiere = new ClMatiere(Convert.ToInt32(numMatiere), libMatiere, float.Parse(coeffMatiere));
                AjouteMatiere(uneMatiere);
            }

            // on cré les élèves
            XPathNodeIterator RecEleve = nav.Select("laClasse/lesEleves/unEleve");
            while (RecEleve.MoveNext())
            {
                string numEleve = RecEleve.Current.SelectSingleNode("numEleve").Value;
                string nomEleve = RecEleve.Current.SelectSingleNode("nomEleve").Value;
                string prenomEleve = RecEleve.Current.SelectSingleNode("prenomEleve").Value;

                unEleve = new ClEleve(Convert.ToInt32(numEleve), nomEleve, prenomEleve, uneClasse);
                AjouteEleve(unEleve);

                // on cré les notes
                XPathNodeIterator RecNote = nav.Select("laClasse/lesEleves/unEleve/lesNotes/uneNote");// on cré la classe
                while (RecNote.MoveNext())
                {
                    string numNote = RecNote.Current.SelectSingleNode("numNote").Value;
                    string valeurNote = RecNote.Current.SelectSingleNode("valeurNote").Value;
                    string dateNote = RecNote.Current.SelectSingleNode("dateNote").Value;
                    string coeffNote = RecNote.Current.SelectSingleNode("coeffNote").Value;
                    string numMatiereNote = RecNote.Current.SelectSingleNode("numMatiereNote").Value;

                    laMatiereNote = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereNote));
                    uneNote = new ClNote(Convert.ToInt32(numNote), float.Parse(valeurNote), dateNote, float.Parse(coeffNote), laMatiereNote);
                    unEleve.AjouteNote(uneNote);
                }

                // on cré les appréciations
                XPathNodeIterator RecAppr = nav.Select("laClasse/lesEleves/unEleve/lesAppreciations/uneAppreciation");
                while (RecAppr.MoveNext())
                {
                    string numAppreciation = RecAppr.Current.SelectSingleNode("numAppreciation").Value;
                    string libAppreciation = RecAppr.Current.SelectSingleNode("libAppreciation").Value;
                    string numMatiereAppr = RecAppr.Current.SelectSingleNode("numMatiereAppr").Value;

                    laMatiereAppr = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereAppr));
                    uneAppreciation = new ClAppreciation(Convert.ToInt32(numAppreciation), libAppreciation, laMatiereAppr);
                    unEleve.AjouteAppreciation(uneAppreciation);
                }
            }
        }

pourriez-vous m'aider xvp ?

6 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Bonjour,
As-tu pensé à utiliser la sérialisation?
Ca pourrait te faciliter la tâche...

<hr />
-Blog-
-Site Perso-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
29
Bonjour,

La méthode "Select" sur un XPathNavigator n'est pas contextuelle (elle ne teint pas compte de la postion courrante dans le fichier) , elle va donc retourner tous les objects présents dans le fichier XML correspondant à la condition passée en parametre.

Dans ton cas, tu parcours le fichier en pas à pas, il faut donc que tu utilises les méthodes qui tiennent compte de la position courrante, par exemple la methode SelectChildren(...) permet de récuperer les noeuds enfants d'un noeud donné.

Mais si tu veux te faciliter le travail, passe par un DataSet, non seulement la gestion du fichier y sera meilleurs, mais en plus les objets de données seront créés automatiquement.

A+
C# is amazing, enjoy it!
Messages postés
7
Date d'inscription
mercredi 13 février 2008
Statut
Membre
Dernière intervention
17 février 2010

c'est bon j'ai trouvé lol, juste aussitot apres avoir posté le message ^^

XPathNodeIterator RecLesNotes = RecEleve.Current.SelectChildren("lesNotes", "");
        while (RecLesNotes.MoveNext())
        {
            XPathNodeIterator RecNote = RecEleve.Current.SelectChildren("uneNote", "");
            while (RecNote.MoveNext())
            {

c'est juste ici : j'ai utilisé RecEleve au lieu de RecLesNotes.
ben oui, ca fonctionne en cascade ce truc ^^
bon ca marche, merci beaucoup !
Messages postés
7
Date d'inscription
mercredi 13 février 2008
Statut
Membre
Dernière intervention
17 février 2010

bonjour,
oui j'y ai pensé mais je n'y arrive pas -_-
c'est sur que ça faciliterait les choses ! ^^
mais peut-etre que tu pourrais m'aider ?

comment pourrais serialiser mes classes avec toutes les collections qui font qu'elles communiquent ?
Messages postés
7
Date d'inscription
mercredi 13 février 2008
Statut
Membre
Dernière intervention
17 février 2010

bonjour Robert33,
merci pour la réponse, je pense que je vais m'orienter vers la méthode SelectChildren() !!
je préfère éviter la sérialisation pour le moment, c'est un peu trop compliqué pour moi ( mais je l'étudierais plus tard, c'est promis ^^ )
aurais-tu des exemple pour SelectChildren() ??
Messages postés
7
Date d'inscription
mercredi 13 février 2008
Statut
Membre
Dernière intervention
17 février 2010

voila donc ce que j'ai essayé

public void chargement_XML(ClClasseEleve uneClasse, string unFichier)
{
    ClMatiere uneMatiere = null;
    ClEleve unEleve = null;
    ClNote uneNote = null;
    ClAppreciation uneAppreciation = null;
    ClMatiere laMatiereNote;
    ClMatiere laMatiereAppr;

    XPathDocument doc = new XPathDocument(unFichier);
    XPathNavigator nav = doc.CreateNavigator();

    // on cré les matières
    XPathNodeIterator RecMatiere = nav.Select("laClasse/lesMatieres/uneMatiere");
    while (RecMatiere.MoveNext())
    {
        string numMatiere = RecMatiere.Current.SelectSingleNode("numMatiere").Value;
        string libMatiere = RecMatiere.Current.SelectSingleNode("libMatiere").Value;
        string coeffMatiere = RecMatiere.Current.SelectSingleNode("coeffMatiere").Value;

        uneMatiere = new ClMatiere(Convert.ToInt32(numMatiere), libMatiere, float.Parse(coeffMatiere));
        AjouteMatiere(uneMatiere);
    }

    // on cré les élèves
    XPathNodeIterator RecEleve = nav.Select("laClasse/lesEleves/unEleve");
    while (RecEleve.MoveNext())
    {
        string numEleve = RecEleve.Current.SelectSingleNode("numEleve").Value;
        string nomEleve = RecEleve.Current.SelectSingleNode("nomEleve").Value;
        string prenomEleve = RecEleve.Current.SelectSingleNode("prenomEleve").Value;

        unEleve = new ClEleve(Convert.ToInt32(numEleve), nomEleve, prenomEleve, uneClasse);
        AjouteEleve(unEleve);

        XPathNodeIterator RecLesNotes = RecEleve.Current.SelectChildren("lesNotes", "");
        while (RecLesNotes.MoveNext())
        {
            XPathNodeIterator RecNote = RecEleve.Current.SelectChildren("uneNote", "");
            while (RecNote.MoveNext())
            {
                string numNote = RecNote.Current.SelectSingleNode("numNote").Value;
                string valeurNote = RecNote.Current.SelectSingleNode("valeurNote").Value;
                string dateNote = RecNote.Current.SelectSingleNode("dateNote").Value;
                string coeffNote = RecNote.Current.SelectSingleNode("coeffNote").Value;
                string numMatiereNote = RecNote.Current.SelectSingleNode("numMatiereNote").Value;

                laMatiereNote = uneClasse.GetUneMatiere(Convert.ToInt32(numMatiereNote));
                uneNote = new ClNote(Convert.ToInt32(numNote), float.Parse(valeurNote), dateNote, float.Parse(coeffNote), laMatiereNote);
                unEleve.AjouteNote(uneNote);
            }
        }
    }
}

pour l'instant je en gère que les notes. les appréciations fonctionnent de la meme maniere, je m'en chargerais donc plus tard.
Bon, pour l'instant ca ne marche pas u_u
pourrais-tu me dire où j'ai commis une faute stp ?