Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > APIs
APIs DOM, SAX, JAXP,STAX... leur fonctionnement, leurs implémentations Avant de poster -> FAQ XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/11/2010, 17h57   #1
Imad_ing
Membre du Club
 
Inscription : mai 2007
Messages : 138
Détails du profil
Informations personnelles :
Âge : 29
Localisation : Maroc

Informations forums :
Inscription : mai 2007
Messages : 138
Points : 40
Points : 40
Envoyer un message via MSN à Imad_ing Envoyer un message via Yahoo à Imad_ing Envoyer un message via Skype™ à Imad_ing
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:
Citation:
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
Imad_ing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2010, 18h29   #2
Imad_ing
Membre du Club
 
Inscription : mai 2007
Messages : 138
Détails du profil
Informations personnelles :
Âge : 29
Localisation : Maroc

Informations forums :
Inscription : mai 2007
Messages : 138
Points : 40
Points : 40
Envoyer un message via MSN à Imad_ing Envoyer un message via Yahoo à Imad_ing Envoyer un message via Skype™ à Imad_ing
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
Imad_ing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2010, 23h37   #3
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 298
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 298
Points : 10 626
Points : 10 626
Envoyer un message via Skype™ à thelvin
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.)
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2010, 14h01   #4
psylox
Membre confirmé
 
Homme Benjamin Rouxel
Développeur informatique
Inscription : avril 2007
Messages : 238
Détails du profil
Informations personnelles :
Nom : Homme Benjamin Rouxel
Âge : 26
Localisation : France, Côtes d'Armor (Bretagne)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 238
Points : 236
Points : 236
Envoyer un message via MSN à psylox
Salut,

Citation:
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
psylox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2010, 16h39   #5
Imad_ing
Membre du Club
 
Inscription : mai 2007
Messages : 138
Détails du profil
Informations personnelles :
Âge : 29
Localisation : Maroc

Informations forums :
Inscription : mai 2007
Messages : 138
Points : 40
Points : 40
Envoyer un message via MSN à Imad_ing Envoyer un message via Yahoo à Imad_ing Envoyer un message via Skype™ à Imad_ing
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
Imad_ing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2010, 17h14   #6
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 298
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 298
Points : 10 626
Points : 10 626
Envoyer un message via Skype™ à thelvin
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...
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2010, 17h39   #7
Imad_ing
Membre du Club
 
Inscription : mai 2007
Messages : 138
Détails du profil
Informations personnelles :
Âge : 29
Localisation : Maroc

Informations forums :
Inscription : mai 2007
Messages : 138
Points : 40
Points : 40
Envoyer un message via MSN à Imad_ing Envoyer un message via Yahoo à Imad_ing Envoyer un message via Skype™ à Imad_ing
Merci ça m'aide beaucoup et ça résout mon problème !!!



Beurk.
__________________
Imad_Ing
Softwear Engineer

Petit à petit, Rôme est batie
Imad_ing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2010, 13h53   #8
psylox
Membre confirmé
 
Homme Benjamin Rouxel
Développeur informatique
Inscription : avril 2007
Messages : 238
Détails du profil
Informations personnelles :
Nom : Homme Benjamin Rouxel
Âge : 26
Localisation : France, Côtes d'Armor (Bretagne)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 238
Points : 236
Points : 236
Envoyer un message via MSN à psylox
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:
Citation:
- 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:
Citation:
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
psylox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2010, 14h41   #9
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 298
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 298
Points : 10 626
Points : 10 626
Envoyer un message via Skype™ à thelvin
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.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h53.


 
 
 
 
Partenaires

Hébergement Web