Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Maroc

    Informations forums :
    Inscription : mai 2007
    Messages : 138
    Points : 41
    Points
    41

    Par défaut [C++][TinyXML]Problème de balise vide

    Bonjour tout le monde.
    J'ai un programme écrit en C++ qui transforme un fichier XML en un fichier TXT.
    J'ai utilisé TinyXML comme parser.
    Le programme me retourne l'erreur suivante:
    Program received signal SIGSEGV, Segmentation fault.
    At D:/xmlToTxt/main1.cpp:224
    Program exited with code 030000000005.
    Debugger finished with status 0
    J'ai vu que dans ma ligne de code 224 est écrit:
    Code :
    1
    2
    TiXmlElement* adresseElement = infoClient->FirstChild("adresse")->ToElement();
    TiXmlText* adresse = adresseElement->FirstChild()->ToText();
    Et quand je suis allé voir côté fichier XML, j'ai remarqué cela:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    <infoClient custCode="1.90000007">
    			<customerCat>Residentiels</customerCat>
    			<codeBillingAccount>8568622</codeBillingAccount>
    			<nom>Monsieur   Imad_Ing</nom>
    			<noteAdresse1>14 ZKT SEBOU AP10 AGDAL</noteAdresse1>
    			<adresse> </adresse>
    			<quartier/>
    			<codePostal>10106</codePostal>

    Mes tests: Est ce que le problème de mémoire pourrait venir de l'espace entré à la place de la valeur de la balise Adresse?
    J'ai remplacé l'espace par une valeur aléatoire est ça plante plus !!!

    Ma question: Est ce que le fait d'avoir un espace à la place du texte dans une balise XML peut causer un problème de segmentation ? Sachant que je code en C++?

    Merci d'avance pour vos réponses et remarques.

    Imad_Ing
    Imad_Ing
    Softwear Engineer

    Petit à petit, Rôme est batie

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Maroc

    Informations forums :
    Inscription : mai 2007
    Messages : 138
    Points : 41
    Points
    41

    Par défaut Re:Problème de balise vide

    Code :
    1
    2
    TiXmlElement* adresseElement = infoClient->FirstChild("adresse")->ToElement();
    TiXmlText* adresse = adresseElement->FirstChild()->ToText();

    C'est comme ça que je pointe sur la balise Adresse de mon XML en utilisant TinyXML.

    Pourrais-je intégrer un test sur la valeur de la balise avant de la prendre ?
    Quelque chose du genre:
    Code :
    1
    2
    3
    4
    5
     
    Si  je trouve un " ";
        Alors je le remplace par "";
        Sinon, je prend la valeur tel qu'elle est;
    Fsi;
    Imad_Ing
    Imad_Ing
    Softwear Engineer

    Petit à petit, Rôme est batie

  3. #3
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 732
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 732
    Points : 16 075
    Points
    16 075

    Par défaut

    Je ne connais pas trop TinyXML, mais il semble qu'il s'occupe
    - soit de normaliser automatiquement les whitespaces
    - soit d'ignorer les nœuds whitespaces
    Dans les deux cas il peut peut-être être configuré pour ne pas le faire.

    Une balise qui ne contient que des espaces, devient une balise vide quand ses espaces sont normalisés (ou que les nœuds whitespaces sont ignorés).
    Autrement dit, ton <adresse> </adresse> est lu comme si c'était <adresse/>. Cela signifie qu'il n'a pas d'enfant et que FirstChild() renverra un pointeur nul. C'est cela qu'il faut surveiller.

    (Je trouve que ce n'est pas très pratique. D'habitude les APIs XML ont des méthodes pour simplifier ce genre de choses. Beurk.)

  4. #4
    Membre confirmé
    Homme Profil pro Benjamin Rouxel
    Développeur informatique
    Inscrit en
    avril 2007
    Messages
    238
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin Rouxel
    Âge : 28
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2007
    Messages : 238
    Points : 231
    Points
    231

    Par défaut

    Salut,

    TiXmlText* adresse = adresseElement->FirstChild()->ToText();
    Je pense qu'il faudrait que tu tests adresseElement->FirstChild() pour déterminer si il est null ou pas, et si il n'est pas null, alors tu peux appeler ToText().
    En gros ton prog essaye d'appeler une méthode d'objet sur quelque chose qui est n'existe pas, et donc seg fault.
    Linux because rebooting is just for adding medias

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Maroc

    Informations forums :
    Inscription : mai 2007
    Messages : 138
    Points : 41
    Points
    41

    Par défaut Re: Problème de balise vide

    Bonjour,

    Je cherche une méthode pour remédier aux éventuels espaces " " trouvés dans une balise de mon fichier XML, et j'ai appliqué ceci:

    Code :
    1
    2
    3
    4
    5
    6
    TiXmlElement* adresseElement = infoClient->FirstChild("adresse")->ToElement();
    const char* temp = elem->Attribute("adresse");
    if temp = " "{
    elem->SetAttribute("adresse", "");
    }
    TiXmlText* adresse = adresseElement->FirstChild()->ToText();

    C'est la solution que j'ai mis en place pour remplacer un espace " " trouvé dans <adresse> </adresse> par exemple et le remplacer par "".

    Ca me retourne une erreur d'incompatibilité de pointeurs! Et je ne sais pas de quoi s'agit il

    Erreur:
    Code :
    1
    2
    3
    4
    5
     
    Compiling: main1.cpp
    mingw32-g++.exe: -pg and -fomit-frame-pointer are incompatible
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Quelqu'un pourrait m'expliquer ou me proposer une autre solution ?


    Merci d'avance pour vos remarques et réponses.

    Imad
    Imad_Ing
    Softwear Engineer

    Petit à petit, Rôme est batie

  6. #6
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 732
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 732
    Points : 16 075
    Points
    16 075

    Par défaut

    On t'a déjà dit quoi faire. Nous on connaît XML, et manifestement ce n'est pas ton cas. Tu devrais plutôt lire ce qu'on te dit.

    Accessoirement, lire quelques tutoriels sur ce que c'est XML, ce que c'est qu'un attribut, un nœud texte, un enfant, et tout ça, ne serait pas du luxe.
    Par exemple, je vois pas comment tu espérais résoudre quoi que ce soit en faisant intervenir des attributs ici.

    Accessoirement, mon C++ est rouillé, mais je suis à peu près sûr que ce n'est pas comme ça qu'on compare des chaînes de caractères. Ni qu'on fait un if. Ceci n'ayant aucune importance puisque, comme on te l'a dit, c'est pas ça que tu es censé faire.

    Ah, et puis les options -pg et -fomit-frame-pointer de g++ ne peuvent pas être utilisées en même temps. Si on pouvait se concentrer sur un problème à la fois...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Maroc

    Informations forums :
    Inscription : mai 2007
    Messages : 138
    Points : 41
    Points
    41

    Par défaut

    Merci ça m'aide beaucoup et ça résout mon problème !!!



    Beurk.
    Imad_Ing
    Softwear Engineer

    Petit à petit, Rôme est batie

  8. #8
    Membre confirmé
    Homme Profil pro Benjamin Rouxel
    Développeur informatique
    Inscrit en
    avril 2007
    Messages
    238
    Détails du profil
    Informations personnelles :
    Nom : Homme Benjamin Rouxel
    Âge : 28
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2007
    Messages : 238
    Points : 231
    Points
    231

    Par défaut

    Comme te le dis thelvin de manière un peu brutal mais non moins instructive, tu devrais lire des cours sur XML.

    pour faire simple:
    Code :
    1
    2
     
    <element attribut="">du texte</element>
    Et donc ce que je te disais:
    Code :
    1
    2
    3
    4
     
    if(adresseElement->FirstChild() != null) {
    adresse = adresseElement->FirstChild()->toText();
    }
    Et vérifie ce que thelvin t'a dit:
    - soit de normaliser automatiquement les whitespaces
    - soit d'ignorer les nœuds whitespaces
    Et si cela est vrai alors tu n'auras pas besoin de faire:
    Si je trouve un " ";
    Alors je le remplace par "";
    Sinon, je prend la valeur tel qu'elle est;
    Fsi;
    Linux because rebooting is just for adding medias

  9. #9
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 732
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 732
    Points : 16 075
    Points
    16 075

    Par défaut

    Citation Envoyé par Imad_ing Voir le message
    Merci ça m'aide beaucoup et ça résout mon problème !!!
    De rien. Ce qu'on a dit résout en effet ton problème, et on peut donc en déduire que ça t'aide. Beaucoup ou pas, ça j'en sais rien, ça dépend ce que ça représente pour toi d'éliminer ton problème.

    Pas de notre faute si tu décides de faire comme si on avait rien dit.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •