Utilisation de RapidXML, je veux faire boucle à travers un ensemble de nœuds et que j'utilise ce que j'ai trouvé comme la meilleure façon de le faire (de Trusty Stackoverflow, le DOC ne semble pas avoir un exemple d'itération):
cout << " LAST IS: " << curNode->first_attribute("shiftLength")->value();
3 Réponses :
while (curNode !=NULL )
Merci Neil (j'ai essayé cette approche avant mais avoir un mauvais accès à RapidXML.HPP (ligne 1031 V 1.13) - Aaaagggghh Mon erreur, même si j'avais essayé de rechercher un attribut après la fin de la boucle). Merci encore.
Voici le code final sous forme de travail:
xml_node<> *curNode = ... // e. g. parentNode->first_node(); while (curNode) { string start = curNode->first_attribute("start")->value(); string numStaff = curNode->first_attribute("numStaff")->value(); cout << start << "\t" << numStaff << endl; curNode = curNode->next_sibling(); }
C'est la bonne façon de itérer si tous les nœuds enfants d'un nœud dans RapidXML:
xml_node<> *node = ... for (xml_node<> *child = node->first_node(); child; child = child->next_sibling()) { // do stuff with child }
Ceci n'est pas pratique si vous êtes sur le point de choisir un nœud aléatoire (par exemple, vous devez connaître le nombre de nœuds et en choisir un au décalage X)
@Tomas Il y a toujours un compromis dans les structures de données. Pour permettre une addition rapide lors de l'analyse, RapidXML utilise des listes liées pour les nœuds d'enfants et les attributs. Par conséquent, l'indexation directe par numéro n'est pas possible. Mais vous devez vous rappeler que RapidXML ne concerne pas la commodité mais la performance.
J'ai écrit un Fonction qui vous donne (à un coût de performance HIT) std :: vecteur code> plein de noeuds d'enfants
. Dès que l'arborescence du document est modifiée, la liste n'est pas valide.
Pensez aux boucles en termes d'invariants. Le vôtre exécute pour tous les nœuds avec des frères et sœurs non nuls. Ce n'est pas vrai pour le dernier nœud.