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++/CLI Discussion :

Lecture d'un fichier XML


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Lecture d'un fichier XML
    Bonjour,

    Dans le cadre de ma formation cnam je dois réalisé un petit programme de parcours de graphe. J'ai choisi de faire ça en c++/cli, pour apprendre le langage en même temps, ce qui n'est peut-etre pas une bonne solution vu que j'ai plein de problèmes.....

    Mon gros souci c'est d'arriver à lire le fichier XML du graphe (on s'est mis d'accord sur une norme).
    exemple :
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <!--Exercice de graphe-->
    <graphe type="orienté" id="G 1">
       <!--Liste des sommets-->
       <Sommet>
          <id>A</id>
          <nom>Paris</nom>
       </Sommet>
       <Sommet>
          <id>B</id>
          <nom>Nancy</nom>
       </Sommet>
       <!--Liste des liens-->
       <Liens>
          <lien>
             <id>1</id>
             <depart>A</depart>
             <arrivee>B</arrivee>
             <poids>300</poids>
          </lien>
          <lien>
             <id>3</id>
             <depart>B</depart>
             <arrivee>A</arrivee>
             <poids>1</poids>
          </lien>
          <lien>
             <id>2</id>
             <depart>A</depart>
             <arrivee>A</arrivee>
             <poids>310</poids>
          </lien>
       </Liens>
    </graphe>
    J'ai codé un petit programme pour parcourir tout ça et récupérer les données :
    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
    104
    105
    106
     
    public: static void LireFichier(Graphe ^g, String ^f)
    			{
    				String ^id, ^nom;
    				String ^idLien, ^depart, ^arrivee, ^poids;
     
    				XmlTextReader ^reader;				
    				try
    				{
    					reader = gcnew XmlTextReader("graphe1.xml");
    					reader->WhitespaceHandling = WhitespaceHandling::None;
    					while (reader->Read())
    					{
    						// Attrape le premier des elements
    						if (reader->NodeType == XmlNodeType::Element && reader->Name == "Sommet")
    						{					
    							if (reader->Name == "Sommet")
    							{							
    								// cherche tous les noeuds enfants au premier element
    								while (reader->NodeType != XmlNodeType::EndElement) // </sommet> ?
    								{
    									reader->Read();
    									// Regarde si le noeud correspond à ce que je veux
    									if (reader->Name == "id" && (reader->NodeType != XmlNodeType::EndElement))
    									{									
    										reader->Read();
    										if (reader->NodeType == XmlNodeType::Text) 
    											Console::WriteLine("valeur id: {0}", reader->Value);
    										id = reader->Value;
    										Console::WriteLine("valeur id version String: {0}", id);
    									}
    									if (reader->Name == "nom" && (reader->NodeType != XmlNodeType::EndElement))
    									{									
    										reader->Read();
    										if (reader->NodeType == XmlNodeType::Text) 
    											Console::WriteLine("valeur nom: {0}", reader->Value);
    										nom = reader->Value;
    										Console::WriteLine("valeur de nom version String: {0}", nom);
    									}								
    								}
    								Sommet ^s = gcnew Sommet(id,nom);
    								Console::WriteLine("id et nom du sommet : {0} : {1}", s->getId, s->getNom);
    								g->addSommet(s);
    								Console::WriteLine("\nnbr de sommet : {0}\n", g->nbrSommet());								
    							}
    						}
     
    						// Attrape le premier des elements
    						if (reader->NodeType == XmlNodeType::Element && reader->Name == "lien")
    						{							
    							if (reader->Name == "lien")
    							{							
    								// cherche tous les noeuds enfants au premier element
    								while (reader->NodeType != XmlNodeType::EndElement)
    								{
    									reader->Read();
    									// Regarde si le noeud correspond à ce que je veux
    									if (reader->Name == "id" && (reader->NodeType != XmlNodeType::EndElement))
    									{									
    										reader->Read();
    										if (reader->NodeType == XmlNodeType::Text) 
    											Console::WriteLine("valeur id lien: {0}", reader->Value);
    										idLien = reader->Value;
    										Console::WriteLine("valeur idLien: {0}", idLien);
    									}
    									if (reader->Name == "depart"&& (reader->NodeType != XmlNodeType::EndElement))
    									{									
    										reader->Read();
    										if (reader->NodeType == XmlNodeType::Text) 
    											Console::WriteLine("valeur depart : {0}", reader->Value);
    										depart = reader->Value;
    										Console::WriteLine("valeur depart: {0}", depart);
    									}
    									if (reader->Name == "arrivee"&& (reader->NodeType != XmlNodeType::EndElement))
    									{									
    										reader->Read();
    										if (reader->NodeType == XmlNodeType::Text) 
    											Console::WriteLine("valeur arrivée: {0}", reader->Value);
    										arrivee = reader->Value;
    										Console::WriteLine("valeur arrivee: {0}", arrivee);
    									}
    									if (reader->Name == "poids"&& (reader->NodeType != XmlNodeType::EndElement))
    									{									
    										reader->Read();
    										if (reader->NodeType == XmlNodeType::Text) 
    											Console::WriteLine("valeur poids : {0}", reader->Value);
    										poids = reader->Value;
    										Console::WriteLine("valeur poids: {0}", poids);
    									}
    									//Successeur::Successeur(idLien, depart, arrivee, poids);
    									//Successeur suc = gcnew Successeur(idLien, depart, arrivee, poids);
    								}
    							}
    						}
    					}
    				}
    				catch(Exception ^e)
    				{
    					Console::WriteLine("Erreur  -- {0}", e->Message);
    				}
    				finally
    				{
    					reader->Close();
    				}
     
    			}
    Et le résultat n'est pas du tout ce que j'attendais !
    Apparemment il passe deux fois sur chaque balise (ex : id et /id). La première fois je récupère bien ma valeur mais elle est tout de suite effacé car il lit la balise de fin (malgré l'instruction : reader->NodeType != XmlNodeType::EndElement)

    est-ce que quelqu'un peut m'aider ?

    Merci d'avance


  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Vu que cette partie n'est pas la plus importante de mon projet, je me suis débrouillé autrement.

    Pour info : j'ai enlevé la boucle While pour parcourir le fichier de manière plus simple avec des reader->Read();

    exemple :
    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
     
    // Attrape le premier des elements
    if (reader->NodeType == XmlNodeType::Element && reader->Name == "Sommet")
    {					
    	if (reader->Name == "Sommet")
    	{							
    		reader->Read();
    		// Regarde si le noeud correspond à ce que je veux
    		if (reader->Name == "id") 
    	        {									
    			reader->Read();									
    			id = reader->Value;	
                            reader->Read(); // pour passer </id>	
    		}
    		reader->Read();
     
    		if (reader->Name == "nom")
    		{									
    			reader->Read();									
    			nom = reader->Value;							
    		}									
    		Console::WriteLine("id : {0} ,nom : {1} ", id, nom);
    	}
    ça fonctionne et c'est l'essentiel pour l'instant !

    merci quand même.

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

Discussions similaires

  1. Problème de lecture d'un fichier XML d'InfoPath
    Par snadus dans le forum InfoPath
    Réponses: 7
    Dernier message: 06/06/2006, 14h45
  2. Lecture d'un fichier XML de config avec Java
    Par cofy dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 31/01/2006, 15h54
  3. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 00h13
  4. Probleme de lecture d'un fichier XML
    Par chleuh dans le forum Langage
    Réponses: 8
    Dernier message: 30/08/2005, 12h04
  5. [C#] [XML] Lecture d'un fichier XML => Combobox
    Par Chad`Chiwa dans le forum Windows Forms
    Réponses: 8
    Dernier message: 09/03/2005, 08h57

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