Gros probleme de lecture d'un fichier xml

Résolu
AdamKadamon Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 17 février 2010 - 16 avril 2009 à 23:25
AdamKadamon Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 17 février 2010 - 17 avril 2009 à 16:13
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

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
17 avril 2009 à 15:26
Bonjour,
As-tu pensé à utiliser la sérialisation?
Ca pourrait te faciliter la tâche...

<hr />
-Blog-
-Site Perso-
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
17 avril 2009 à 15:36
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!
3
AdamKadamon Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 17 février 2010
17 avril 2009 à 16:13
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 !
3
AdamKadamon Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 17 février 2010
17 avril 2009 à 15:31
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AdamKadamon Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 17 février 2010
17 avril 2009 à 15:42
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() ??
0
AdamKadamon Messages postés 7 Date d'inscription mercredi 13 février 2008 Statut Membre Dernière intervention 17 février 2010
17 avril 2009 à 16:11
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 ?
0
Rejoignez-nous