Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rapidxml: how to iterate through nodes? Leaves out last sibling

Using rapidxml I'm wanting to loop through a set of nodes, and am using what I found to be the best way to do this (from trusty stackoverflow, the doc doesn't appear to have an example of iteration):

while (curNode->next_sibling() !=NULL ) {
    string shiftLength = curNode->first_attribute("shiftLength")->value();
    cout << "Shift Length " << "\t" << shiftLength << endl;
    curNode = curNode->next_sibling();        
}

Unfortunately, on my OSX 10.6 this is leaving out the last sibling node - I guess because in the last iteration of the loop, next_sibling is called twice. I can get at this last node if I write, after the loop:

cout << " LAST IS: " << curNode->first_attribute("shiftLength")->value();

...but that's dodgy, and the program quits at that point.

First question: Could this be a unique foible of my setup (OSX 10.6) or have I coded wrong?

Second question: Does anyone have an example of what they believe is the correct way to iterate through an unknown number of XML nodes using rapidxml?

Thanks guys

Pete

like image 863
Pete 2233 Avatar asked Mar 05 '11 10:03

Pete 2233


3 Answers

This is the proper way to iterate though all child nodes of a node in rapidxml:

xml_node<> *node = ...
for (xml_node<> *child = node->first_node(); child; child = child->next_sibling())
{
    // do stuff with child
}
like image 52
kaalus Avatar answered Nov 15 '22 20:11

kaalus


Here's the final code in working form:

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();
}
like image 24
Pete 2233 Avatar answered Nov 15 '22 21:11

Pete 2233


while (curNode->next_sibling() !=NULL )

This says "while there's one more node left after the one I'm working on". That's why your loop's stopping early - when curNode is the final sibling, its "next_sibling" will be NULL. This test should work better:

while (curNode !=NULL )
like image 25
Neil Vass Avatar answered Nov 15 '22 21:11

Neil Vass