2010-04-06 4 views

Répondre

4

La réponse de Begemoth me semble plutôt bonne.

Voici une version simplifiée de la méthode de TiXmlElement accept(), qui n'utilise pas un visiteur et prend place un TiXmlNode * comme paramètre: méthode

void TiXmlIterator::iterate(const TiXmlNode* el) 
{ 
    cout << "Iterating Node " << el->Value() << endl; 
    // More useful code here... 

    for (const TiXmlNode* node=el->FirstChild(); node; node=node->NextSibling()) 
    { 
    iterate(node); 
    } 
// And/Or here. 
} 

Le accept() prend un TiXmlVisitor comme paramètre et fait tout le itération pour vous, cependant. Et vous n'avez pas à l'appeler sur tout le document, juste le nœud racine du sous-arbre que vous voulez traverser. De cette façon, vous pouvez définir un comportement spécifique pour les sous-classes de TiXmlNode, en remplaçant les bonnes méthodes. Regardez l'implémentation de TiXmlPrinter dans TinyXml's source code pour un bon exemple de la façon dont c'est fait.

Dans le cas où vous ne voulez pas le faire, est un autre exemple ici:

bool MyTiXmlVisitor::Visit(const TiXmlText& text) 
{ 
    cout << "Visiting Text: " << text.Value() << endl; 

    return true; // This will ensure it keeps iterating 
} 

Ceci agira sur tous les éléments de texte dans la sous-arborescence du nœud que vous appelez accept() sur. Pour agir sur tous les éléments, remplacer les méthodes virtuelles restantes de TiXmlVisitor. Ensuite, dans le code où vous voulez itérer sur la sous-arborescence, procédez comme suit:

subtree_root_node->Accept(my_tixmlvisitor_object); 
+0

Vous recherchez code réel. – Raindog

+0

Le code TiXmlPrinter devrait être un bon point de départ. Y a-t-il quelque chose que vous vouliez faire à chaque nœud spécifiquement? – brak3000

+0

Ok, édité ma réponse pour préciser ce que je et (je suppose) Begemoth signifiait. HTH. – brak3000

2

Vous pouvez utiliser l'implémentation de modèle de visiteur dans la bibliothèque. Créez une classe héritée de TiXmlVistor, remplacez les méthodes nécessaires telles que VisitElement, puis appelez la méthode Accept() pour un nœud particulier.

+0

Pas tout à fait ce que je demandais – Raindog

Questions connexes