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

APIs XML Discussion :

[C++][TinyXML]Problème de balise vide


Sujet :

APIs XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Points : 72
    Points
    72
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Points : 72
    Points
    72
    Par défaut Re:Problème de balise vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    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 régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Points : 72
    Points
    72
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Points : 72
    Points
    72
    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 actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <element attribut="">du texte</element>
    Et donc ce que je te disais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XML] ChildNodes: différencier si balise vide ou inexistante
    Par MiJack dans le forum Composants VCL
    Réponses: 4
    Dernier message: 05/04/2006, 14h25
  2. XSL - choose et test pour balise vide
    Par enigma dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/07/2005, 08h02
  3. [DOM] Pb avec les "BALISE vide"
    Par PhalconX dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 18/06/2005, 22h16
  4. [RegEx] problème de balises
    Par Asarnil dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2004, 15h13
  5. [DOM] Balise vide...
    Par carlierd dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 02/05/2003, 18h28

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