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

C# Discussion :

Quelles sont les bonnes pratiques pour la lecture d'un fichier XML en c#?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut Quelles sont les bonnes pratiques pour la lecture d'un fichier XML en c#?
    bonjour tout le monde, je viens encore polluer le forum avec mes questions XD
    bon, voila la question du jour : pourriez-vous m'aider à lire ce fichier XML, s.v.p ?

    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
    <classe>
    	<numClasse></numClasse>
    	<libClasse></libClasse>
     
    	<lesMatieres>
    		<uneMatiere>
    			<numMatiere></numMatiere>
    			<libMatiere></libMatiere>
    			<coeffMatiere></coeffMatiere>
    		</uneMatiere>
    		<uneMatiere>
    			<numMatiere></numMatiere>
    			<libMatiere></libMatiere>
    			<coeffMatiere></coeffMatiere>
    		</uneMatiere>
    	</lesMatieres>
     
    	<lesEleves>
    		<unEleve>
    			<numELeve></numEleve>
    			<nomELeve></nomEleve>
    			<prenomELeve></prenomELeve>
    			<uneNote>
    				<numNote></numNote>
    				<valeurNote></valeurNote>
    				<dateNote></dateNote>
    				<coeffNote></coeffNote>
    				<numMatiereNote></numMatiereNote>
    			</uneNote>
    			<uneNote>
    				<numNote></numNote>
    				<valeurNote></valeurNote>
    				<dateNote></dateNote>
    				<coeffNote></coeffNote>
    				<numMatiereNote></numMatiereNote>
    			</uneNote>
    			<uneAppreciation>
    				<numAppreciation></numAppreciation>
    				<libAppreciation></libAppreciation>
    				<numMatiereAppr></numMatiereAppr>
    			</uneAppreciation>
    			<uneAppreciation>
    				<numAppreciation></numAppreciation>
    				<libAppreciation></libAppreciation>
    				<numMatiereAppr></numMatiereAppr>
    			</uneAppreciation>
    		</unEleve>
    		<unEleve>
    			<numELeve></numEleve>
    			<nomELeve></nomEleve>
    			<prenomELeve></prenomELeve>
    			<uneNote>
    				<numNote></numNote>
    				<valeurNote></valeurNote>
    				<dateNote></dateNote>
    				<coeffNote></coeffNote>
    				<numMatiereNote></numMatiereNote>
    			</uneNote>
    			<uneNote>
    				<numNote></numNote>
    				<valeurNote></valeurNote>
    				<dateNote></dateNote>
    				<coeffNote></coeffNote>
    				<numMatiereNote></numMatiereNote>
    			</uneNote>
    			<uneAppreciation>
    				<numAppreciation></numAppreciation>
    				<libAppreciation></libAppreciation>
    				<numMatiereAppr></numMatiereAppr>
    			</uneAppreciation>
    			<uneAppreciation>
    				<numAppreciation></numAppreciation>
    				<libAppreciation></libAppreciation>
    				<numMatiereAppr></numMatiereAppr>
    			</uneAppreciation>
    		</unEleve>		
    	</lesEleves>
    </classe>
    j'aimerai savoir s'il serait possible d'utiliser une sorte de boucle foreach pour lire les différents nœuds...

    j'aurais d'autres questions après.
    Voici mon code actuel, vous l'aurez deviné, je ne suis pas allé bien loin, lol.

    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
    public void chargementFICHIER_XML(string nomFichier)
    {
        ClClasseEleve uneClasse;
        ClMatiere uneMatiere;
     
        StreamReader sr = new StreamReader("H:\\PTI\\carnet de notes\\BulletinScolaire\\" + nomFichier);
        string Ligne;
        Ligne = sr.ReadLine();
        while (Ligne != null)
        {
            string numClasse;
            string libClasse;
     
            Ligne = Ligne.Substring(13);
            numClasse = Ligne.Substring(0, Ligne.IndexOf("</numClasse>"));
            Ligne = Ligne.Substring(Ligne.IndexOf("<libClasse>") + 6);
            libClasse = Ligne.Substring(0, Ligne.IndexOf("</libClasse>"));
     
            uneClasse = new ClClasseEleve(numClasse,libClasse);
        }
    }
    merci à l'avance pour votre aide
    cordialement

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Effectivement, c'est pas vraiment optimisé. Il existe des classes prévues pour lire les fichiers Xml:
    • XmlDocument avec XPath (petits fichiers)
    • XmlTextReader (gros fichiers)
    • XmlReader (gros fichiers)
    Il y a des tutos ici: http://xml.developpez.com/cours/

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    merci pour la réponse, je suis allé voir les cours...
    j'ai un peu de mal à comprendre mais je persévère ^^

    merci encore,

    je reviendrais plus tard pour d'autres questions

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    salut, je reviens pour poster quelques lignes de code.
    voici le procédure de sauvegarde de mon application. a priori, elle n'a pas de probleme, mais qui sait ^^

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    public void Sauvegarde_XML()
    {
    	int nbMatiere;
    	int nbEleve;
    	ClMatiere uneMatiere;
    	ClEleve unEleve;
     
    	int nbNotes;
    	ClNote uneNote;
    	ArrayList lesNotes;
     
    	int nbAppreciations;
    	ClAppreciation uneAppreciation;
    	ArrayList lesAppreciations;
     
     
    	StreamWriter sw = new StreamWriter("H:\\PTI\\carnet de notes	\\BulletinScolaire\\saveXML.xml");
     
    	// Debut de fichier XML, enregistrement de la classe
    	sw.WriteLine("<laClasse>");
    	sw.WriteLine("<numClasse>" + GetNumClasse() + "</numClasse>");
    	sw.WriteLine("<libClasse>" + GetlibClasse() + "</libClasse>");
     
    	// on enregistre les matières
    	nbMatiere = LesMatieres.Count;
    	if (nbMatiere > 0)
    	{
    		sw.WriteLine("<lesMatieres>");
    		for (int i = 0; i < nbMatiere; i++)
    		{
    			uneMatiere = ((ClMatiere)LesMatieres[i]);
     
    			sw.WriteLine("<uneMatiere>");
    			sw.WriteLine("<numMatiere>" + uneMatiere.GetNumMatiere() + "</numMatiere>");
    			sw.WriteLine("<libMatiere>" + uneMatiere.GetLibMatiere() + "</libMatiere>");
    			sw.WriteLine("<coeffMatiere>" + uneMatiere.GetCoeffMatiere() + "</coeffMatiere>");
    			sw.WriteLine("</uneMatiere>");
    		}
    		sw.WriteLine("<lesMatieres>");
    	}
     
    	// on enregistre les élèves
    	nbEleve = LesEleves.Count;
    	if (nbEleve > 0)
    	{
    		sw.WriteLine("<lesEleves>");
    		for (int i = 0; i < nbEleve; i++)
    		{
    			unEleve = ((ClEleve)LesEleves[i]);
     
    			sw.WriteLine("<unEleve>");
    			sw.WriteLine("<numEleve>" + unEleve.GetNumEleve() + "</numEleve>");
    			sw.WriteLine("<nomEleve>" + unEleve.GetNomEleve() + "</nomEleve>");
    			sw.WriteLine("<prenomEleve>" + unEleve.GetPrenomEleve() + "</prenomEleve>");
     
    			lesNotes = unEleve.GetLesNotes();
    			nbNotes = unEleve.GetNbNotes();
    			if (nbNotes > 0)
    			{
    				for (int j = 0; j < nbNotes; j++)
    				{
    					uneNote = ((ClNote)lesNotes[i]);
    					sw.WriteLine("<uneNote>");
    					sw.WriteLine("<numNote>" + uneNote.GetNumNote() + "</numNote>");
    					sw.WriteLine("<valeurNote>" + uneNote.GetValeurNote() + "</valeurNote>");
    					sw.WriteLine("<dateNote>" + uneNote.GetDateNote() + "</dateNote>");
    					sw.WriteLine("<coeffNote>" + uneNote.GetCoeffNote() + "</coeffNote>");
     
    					// la matiere pour cette note
    					uneMatiere = uneNote.GetLaMatiere();
    					sw.WriteLine("<numMatiereNote>" + uneMatiere.GetNumMatiere() + "</numMatiereNote>");
     
    					sw.WriteLine("</uneNote>");
    				}
    			}
     
    			lesAppreciations = unEleve.GetLesAppreciation();
    			nbAppreciations = unEleve.GetNbAppreciation();
    			if (nbAppreciations > 0)
    			{
    				for (int j = 0; j < nbAppreciations; j++)
    				{
    					uneAppreciation = ((ClAppreciation)lesAppreciations[i]);
    					sw.WriteLine("<uneAppreciation>");
    					sw.WriteLine("<numAppreciation>" + uneAppreciation.GetNumAppreciation() + "</numAppreciation>");
    					sw.WriteLine("<libAppreciation>" + uneAppreciation.GetLibAppreciation() + "</libAppreciation>");
     
    					// la matiere pour cette appreciation
    					uneMatiere = uneAppreciation.GetLaMatiere();
    					sw.WriteLine("<numMatiereAppr>" + uneMatiere.GetNumMatiere() + "</numMatiereAppr>");
     
    					sw.WriteLine("</uneAppreciation>");
    				}
    			}
    			sw.WriteLine("</unEleve>");
    		}
    		sw.WriteLine("<lesEleves>");
    	}
     
    	// Fin de fichier XML
    	sw.WriteLine("</laClasse>");
    	sw.Close();
    }
    Et voici le code pour recharger les infos contenus dans le fichier XML, c'est ici que j'ai le plus de soucis à me faire je pense ^^

    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
    public void chargement_XML()
    {
    	ClClasseEleve uneClasse;
    	ClEleve unEleve;
    	ClNote uneNote;
    	ClAppreciation uneAppreciation;
    	ClMatiere laMatiereNote;
    	ClMatiere laMatiereAppr;
     
    	XPathDocument doc = new XPathDocument("H:\\PTI\\carnet de notes	\\BulletinScolaire\\saveXML.xml");
    	XPathNavigator nav = doc.CreateNavigator();
     
    	// on cré la classe
    	XPathNodeIterator RecClasse = nav.Select("classe");
    	while (RecClasse.MoveNext())
    	{
        		string numClasse = RecClasse.Current.SelectSingleNode("numClasse").Value;
        		string libClasse = RecClasse.Current.SelectSingleNode("libClasse").Value;
     
        		uneClasse = new ClClasseEleve(numClasse, libClasse);
    	}
     
    	// on cré les élèves
    	XPathNodeIterator RecEleve = nav.Select("classe/lesEleves/unEleve");
    	// Pour chaque matiere
    	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(numELeve, nomELeve, prenomELeve, uneClasse);
        		AjouteEleve(unEleve);
     
        		// on cré les notes
        		XPathNodeIterator RecNote = nav.Select("classe/lesEleves/unEleve/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 = unEleve.ChercheMatiereNote(numMatiereNote);
            		uneNote = new ClNote(numNote, float.Parse(valeurNote), dateNote, float.Parse(coeffNote), laMatiereNote);
            		unEleve.AjouteNote(uneNote);
        		}
     
        		// on cré les notes
        		XPathNodeIterator RecAppr = nav.Select("classe/lesEleves/unEleve/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 = unEleve.ChercheMatiereAppr(numMatiereAppr);
            		uneAppreciation = new ClAppreciation(numAppreciation, libAppreciation, laMatiereAppr);
            		unEleve.AjouteAppreciation(uneAppreciation);
        		}
    	}
    }
    qu'en pensez-vous ?

    Ce que je veux savoir, c'est juste si j'ai correctement récupéré les infos entre les balises, avec le respect des nœuds et tout ...
    merci

    EDIT :
    j'ai trouvé un bug !
    à la ligne ou il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unEleve = new ClEleve(numELeve, nomELeve, prenomELeve, uneClasse);
    en résultat j'ai "Erreur 1 Utilisation d'une variable locale non assignée 'uneClasse' H:\PTI\carnet de notes\ClassBulletin\ClassBulletin\ClClasseEleve.cs 276 72 ClassBulletin
    "

    cette ligne de code doit utiliser l'objet uneClasse définit plus haut.
    seulement l'instanciation se fait dans un while alors que je veux qu'il ne se fasse qu'une seule fois, car je ne gère qu'une seule classe d'élèves dans mon projet :s

    comment pourrais-je améliorer cette partie du code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // on cré la classe
    	XPathNodeIterator RecClasse = nav.Select("classe");
    	while (RecClasse.MoveNext())
    	{
        		string numClasse = RecClasse.Current.SelectSingleNode("numClasse").Value;
        		string libClasse = RecClasse.Current.SelectSingleNode("libClasse").Value;
     
        		uneClasse = new ClClasseEleve(numClasse, libClasse);
    	}

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Par défaut
    j'ai améliroré mon script, et réparant de grosses erreures.
    voici le nouveau code de chargement 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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public void chargement_XML()
    {
    	ClClasseEleve uneClasse;
    	ClEleve unEleve;
    	ClNote uneNote;
    	ClAppreciation uneAppreciation;
    	ClMatiere laMatiereNote;
    	ClMatiere laMatiereAppr;
     
    	XPathDocument doc = new XPathDocument("H:\\PTI\\carnet de notes\\BulletinScolaire\\saveXML.xml");
    	XPathNavigator nav = doc.CreateNavigator();
     
    	// on cré la classe
    	XPathNodeIterator RecClasse = nav.Select("classe");
    	string numClasse = RecClasse.Current.SelectSingleNode("numClasse").Value;
    	string libClasse = RecClasse.Current.SelectSingleNode("libClasse").Value;
    	uneClasse = new ClClasseEleve(numClasse, libClasse);
     
    	// on cré les élèves
    	XPathNodeIterator RecEleve = nav.Select("classe/lesEleves/unEleve");
    	// Pour chaque matiere
    	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(numELeve, nomELeve, prenomELeve, uneClasse);
        		AjouteEleve(unEleve);
     
        		// on cré les notes
        		XPathNodeIterator RecNote = nav.Select("classe/lesEleves/unEleve/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 = unEleve.ChercheMatiereNote(numMatiereNote);
            		uneNote = new ClNote(numNote, float.Parse(valeurNote), dateNote, float.Parse(coeffNote), laMatiereNote);
            		unEleve.AjouteNote(uneNote);
        		}
     
        		// on cré les notes
        		XPathNodeIterator RecAppr = nav.Select("classe/lesEleves/unEleve/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 = unEleve.ChercheMatiereAppr(numMatiereAppr);
            		uneAppreciation = new ClAppreciation(numAppreciation, libAppreciation, laMatiereAppr);
            		unEleve.AjouteAppreciation(uneAppreciation);
        		}
    	}
    }

  6. #6
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Ca me parait pas mal du tout pour un début.

    Pour Sauvegarde_XML() utilise un XmlWriter plutôt qu'un StreamWriter. XmlWriter possède des méthodes spécialisées pour ouvrir ou fermer des éléments ou des attributs.

    Pour la restitution de ton Xml jette un oeil à la Serialization/Deserialization. Cela permet de créer une collection d'objets métier correspondants à ton xml en deux lignes de code.

    Il serait préférable (bonne pratique) que tu assignes une valeur à tes types. Au moins leur donner une valeur "null":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClMatiere uneMatiere = null;
    Sinon, cela peut provoquer des erreurs.

    Il y a aussi des erreurs dans ton fichier xml d'origine sur la casse des noms des noeuds.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. [Python 3.X] Import dans des modules? Comment faire et quelles sont les bonnes pratiques?
    Par Davjack dans le forum Général Python
    Réponses: 2
    Dernier message: 03/07/2014, 12h13
  2. Réponses: 5
    Dernier message: 25/05/2009, 14h59
  3. Réponses: 7
    Dernier message: 23/03/2009, 22h38
  4. Quelles sont les bonnes pratiques avec Zend Framework ?
    Par Community Management dans le forum Zend Framework
    Réponses: 14
    Dernier message: 02/02/2009, 20h35
  5. [C#/ASP.Net/DAL] Quelles sont les bonnes pratiques ?
    Par fouhaa dans le forum Accès aux données
    Réponses: 4
    Dernier message: 13/07/2006, 23h54

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