2010-01-20 8 views
5

Ho appena iniziato a utilizzare rapidXML poiché mi è stato consigliato. In questo momento per scorrere su più fratelli faccio questo:C++ rapidxml node_iterator esempio?

//get the first texture node  
xml_node<>* texNode = rootNode->first_node("Texture"); 
if(texNode != 0){ 
    string test = texNode->first_attribute("path")->value(); 
    cout << test << endl; 
} 
//get all its siblings 
while(texNode->next_sibling() != 0){ 
    string test = texNode->first_attribute("path")->value(); 
    cout << test << endl; 
    texNode = texNode->next_sibling(); 
} 

come un test di base e funziona benissimo. Ad ogni modo, mi sono imbattuto in node_iterator che sembra essere una classe di iteratori in più per fare questo per me. comunque, non ho trovato nessun esempio su come usarlo, quindi mi chiedevo se qualcuno potesse mostrarmi :)

grazie!

+0

Fare attenzione a rapidxml in quanto non esegue alcun controllo significativo della correttezza formale ... –

+0

L'esempio precedente è il modo giusto per farlo. Tranne se provi per texNode-> next_sibling()! = 0 all'inizio del tuo ciclo while, quando arrivi all'ultima parentela e imposta texNode = texNode-> next_sibling(); alla fine del ciclo while, quel textNode non avrà un next_sibling poiché è l'ultimo. Quindi il ciclo while non elaborerà mai l'ultimo fratello a causa di quel controllo iniziale. – NSDestr0yer

risposta

2

Il documentation che ho potuto trovare documenti no node_iterator tipo. Non riesco nemmeno a trovare la parola iterator su quella pagina tranne che in riferimento agli output iterator, che chiaramente non vuoi.

Potrebbe essere che si tratti di un'API interna o di uno in fase di sviluppo, quindi probabilmente è meglio non utilizzarlo in questo momento.

+0

sì, questo è quello che ho immaginato, se includo l'iterator.hpp che viene con esso getta abbastanza alcuni errori su GCC 4.2 su un mac comunque. – user240137

1

No RapidXml non fornisce alcun iteratore. La tua soluzione è quella da seguire ... manualmente usando la funzione first_node, next_sibling e così via ... RapidXml è fatto per essere leggero e veloce ... Anche se un programmatore apprezzerebbe sicuramente qualche sintassi per aiutarlo :)

2
#include "rapidxml/rapidxml.hpp" 
#include "rapidxml/rapidxml_utils.hpp" 
#include "rapidxml/rapidxml_iterators.hpp" 

... 

rapidxml::xml_document<wchar_t> doc; 
doc.parse<0>(xmlFile.data()); 

rapidxml::node_iterator<wchar_t> begIt(doc.first_node()); 
rapidxml::node_iterator<wchar_t> endIt; 

... 

std::for_each(begIt, endIt, [] (rapidxml::xml_node<wchar_t>& node) 
{ 
    std::wcout << node.name() << std::endl; 
}); 
+0

sputa un sacco di errori se includo il rapidxml_iterators.hpp –