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

XML Discussion :

[TinyXML]


Sujet :

XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Par défaut [TinyXML]
    Bonjour,
    j'essaye de modifier un fichier XML avec la bibliothèque tinyXML mais j'ai des erreurs de violation Access quand j'exécute le programme.

    Je suis novice en C++ et en XML (j'ai commencer il y a peine 1 jour). Je suis partie du tutoriel de khayyam90 (http://khayyam.developpez.com/articles/cpp/tinyxml/)

    Mon bout de code est ci-dessous :

    Code c++ : 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
    //construction du chemin complet du fichier
    sprintf(sXmlFileWay,"%s%s",sRepertoireDeTravail,tabsFileNames[i]);
     
    //chargement du fichier xml
    TiXmlDocument doc(sXmlFileWay);
    if(!doc.LoadFile())
    {
       sprintf(sMessageError,"erreur chargement fichier %s.\n error n°%i : %s",sXmlFileWay,doc.ErrorId(),doc.ErrorDesc());
       return 1;
    }
     
    //recherche des balise à modifer + modification
    TiXmlHandle hdl(&doc);
    //init de l'élément dans la section XML_InfosGeneral
    TiXmlElement *elem = hdl.FirstChildElement().FirstChildElement().FirstChildElement().FirstChildElement().Element();
     
    //on test si on lit correctement la section application
    sTempo=string(elem->Attribute("application"));
     
    doc.SaveFile(sXmlFileWay);

    mon fichier xml est du format suivant :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
    <Trace>
    	<XML_InfosGenerales>
    		<application>Lexia</application>
    		<formatSortie>11</formatSortie>
    		<typeFichier>12</typeFichier>
    		<version>1.1</version>
    	</XML_InfosGenerales>
    ...

    ==> ce que je veux faire, c'est changer le "formatSortie" en 12 (par exemple) et de même pour "typeFichier" et "version".

    Dans mon programme, j'ai un access violation sur la ligne :
    "sTempo=string(elem->Attribute("application"));"

    Ce problème ne se produit pas si je test mon programme avec le fichier xml du tutoriel (le fichier XML que j'utilise ne peux être modifier que par mon programme).


    J'espère que je suis assez clair et d'avance merci pour vos réponses suggestions.

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Par défaut
    je suis allé un peut plus loins dans ce que je veux faire, j'arrive a aller dans l'élement que je souhaite et à le lire mais je ne trouve pas le moyen de le modifier :

    voici mon code mis à jour :
    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
     
    TiXmlDocument doc(sXmlFileWay);
    		if(!doc.LoadFile())
    		{
    			sprintf(sMessageError,"erreur chargement fichier %s.\n error n°%i : %s",sXmlFileWay,doc.ErrorId(),doc.ErrorDesc());
    			return 1;
    		}
    		//recherche des balise à modifer + modification
    		TiXmlHandle hdl(&doc);
     
    		//FORMAT SORTIE
    		//init de l'élément dans la section XML_InfosGeneral
    		TiXmlElement *elem = hdl.FirstChildElement("Trace").FirstChildElement("XML_InfosGenerales").FirstChildElement("formatSortie").Element();
     
    		//on test si on lit correctement la section application
    		sTempo=string(elem->GetText());
    		if(sTempo!=sType_Fichier)
    		{
    			//on change le type de format de sortie
     
     
    		}
    si qq pouvais m'aider
    merci

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Bonsoir,

    Petite remarque pour commencer : c'est dangereux d'enchaîner les FirstChildElement, si jamais ton fichier XML n'est pas intègre (si il n'y a pas de balise formatSortie par exemple) tu risque d'avoir un beau plantage.
    Tu n'es pas obligé de passer par un élément TiXmlHandle, tu peux utiliser directement le TiXmlDoc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TiXmlElement *elem = doc.FirstChildElement("Trace");
    if(elem)
    {
    	elem = elem->FirstChildElement("XML_InfosGenerales");
    	if(elem)
    	{
    		elem = elem->FirstChildElement("formatSortie")
    		if(elem)
    		{
    			elem = elem->Element();
    		}
    	}
    }
    C'est pas beau mais c'est plus sûr, sauf si tu es sûr et certain que ton fichier est intègre, ce qui n'existe pas en informatique.

    Pour ton problème, je me suis déjà casser les dents dessus et je n'ai pas trouvé de solution... sauf.

    Dans la philosophie du XML, les balises servent à créer une hiérarchie entre les informations et les attributs à les stocker, donc le mieux que tu ais à faire c'est d'organiser ton fichier ainsi (si tu peux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?xml version="1.0" encoding="UTF-8"?>
    <Trace>
    	<XML_InfosGenerales application="Lexia" formatSortie="11" typeFichier="12" version="1.1" />
    	<XML_InfosGenerales...
    ...
    Tu pourras alors accéder aux données ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	const char* temp = elem->Attribute("formatSortie");
    et surtout les modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	elem->SetAttribute("formatSortie", "12");

Discussions similaires

  1. [XML] TinyXml -> Erreur?
    Par JulienDuSud dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 08/08/2007, 21h17
  2. utiliser TinyXML
    Par Blowih dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 07/11/2006, 21h42
  3. [TinyXML] vérification d'un fichier avec une DTD
    Par vasilov dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 14/03/2006, 15h33
  4. Besoin d'aide avec TinyXML
    Par Clad3 dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 15/08/2005, 18h20

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