[TinyXML] Parcourir les enfants d'un TinyXmlElement

Salut 4ian,
je voudrais savoir comment on peut parcourir tous les enfants d’un Element avec TinyXml.
Les seules solutions que j’ai trouvé se sont montrée buggées (Game Develop bug lors du chargement du fichier).

(C’est au niveau du chargement des enfants de )

[code]void PathAutomatism::LoadFromXml(const TiXmlElement * elem)
{
if(elem->FirstChildElement(“Paths”) != 0)
LoadPathsFromXml(const_cast<TiXmlElement*>(elem->FirstChildElement(“Paths”)));

ChangeCurrentPath("Object main path");

GD_CURRENT_ELEMENT_LOAD_ATTRIBUTE_FLOAT("speed", speed);
GD_CURRENT_ELEMENT_LOAD_ATTRIBUTE_BOOL("reverseAtEnd", reverseAtEnd);
GD_CURRENT_ELEMENT_LOAD_ATTRIBUTE_BOOL("stopAtEnd", stopAtEnd);
GD_CURRENT_ELEMENT_LOAD_ATTRIBUTE_BOOL("followAngle", followAngle);

}

void PathAutomatism::LoadPathsFromXml(TiXmlElement * elem)
{
localePaths.clear();

TiXmlNode *child = 0;
while( (child = elem->IterateChildren( child )) )
{
	localePaths[child->ToElement()->Attribute("name")] = GetCoordsVectorFromString(child->ToElement()->Attribute("coords"), '/', ';');
}

if(localePaths.size() == 0)
{
    localePaths["Object main path"] = std::vector<sf::Vector2f>(1, sf::Vector2f(0,0));
}

}[/code]

Merci d’avance.

    LoadPathsFromXml(const_cast<TiXmlElement*>(elem->FirstChildElement("Paths")));

Enlève le const_cast et déclare alors :

void PathAutomatism::LoadPathsFromXml(const TiXmlElement * elem)

Ensuite, dans cette méthode, si tu veux parcourir tous les enfants ( nommés ici “Enfant” ) du noeud elem :

[code]localePaths.clear();
const TiXmlElement * childElem = elem->FirstChildElement(“Enfant”);
while(childElem )
{
//Pour récupérer par exemple un attribut ( en évitant le plantage si jamais il n’existe pas )
//std::string value = childElem->Attribute(“value”) != NULL ? childElem->Attribute(“value”) : “”;

childElem = childElem->NextSiblingElement();

}
[/code]

( A noter que tu peux enlever “Enfant” et faire juste elem->FirstChildElement(); pour parcourir les noeuds enfants sans disctinction de nom, mais c’est plus propre de s’assurer qu’on parcourt des noeuds avec des noms bien définis ).

L’équivalent pour la sauvegarde. Je prends ici l’exemple d’un std::vectorstd::string nommés dependencies. J’enregistre toutes les valeurs dans des noeuds enfants au noeud root :

[code] for ( unsigned int i = 0;i < dependencies.size();++i)
{
TiXmlElement * dependencyElem = new TiXmlElement( “Dependency” );
root->LinkEndChild( dependencyElem );

    //Puis on enregistre un attribut par exemple :
    //dependencyElem->SetAttribute("sourceFile", dependencies[i].c_str());
}[/code]

Merci, ça marche mieux. Et puis, en plus, j’avais pas enregistré la balise mère sous le nom de mais de . :slight_smile: