rapidxml: как перебирать узлы? Оставляет последнего брата - PullRequest
7 голосов
/ 05 марта 2011

Используя rapidxml, я хочу пройтись по набору узлов и использую, как мне показалось, лучший способ сделать это (из верного стека overflow, у документа, похоже, нет примера итерации):

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

К сожалению, на моем OSX 10.6 это без последнего узла-брата - я думаю, потому что в последней итерации цикла next_sibling вызывается дважды.Я могу добраться до этого последнего узла, если я напишу после цикла:

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

... но это хитроумно, и программа завершает работу в этот момент.

Первый вопрос: может ли этобыть уникальным недостатком моей установки (OSX 10.6) или я неправильно закодировал?

Второй вопрос: есть ли у кого-нибудь пример того, что, по их мнению, является правильным способом перебора неизвестного числа узлов XML с использованием rapidxml??

Спасибо, ребята

Пит

Ответы [ 3 ]

12 голосов
/ 16 июля 2011

Это правильный способ перебора всех дочерних узлов узла в rapidxml:

xml_node<> *node = ...
for (xml_node<> *child = node->first_node(); child; child = child->next_sibling())
{
    // do stuff with child
}
5 голосов
/ 05 марта 2011

Вот окончательный код в рабочей форме:

while( curNode != NULL ) {

    string start = curNode->first_attribute("start")->value();
    string numStaff = curNode->first_attribute("numStaff")->value();
    cout << start << "\t" << numStaff << endl;
   curNode = curNode->next_sibling();
}
1 голос
/ 05 марта 2011
while (curNode->next_sibling() !=NULL )

Там написано "пока остался еще один узел после того, над которым я работаю".Вот почему ваш цикл останавливается рано - когда curNode является последним братом, его "next_sibling" будет иметь значение NULL.Этот тест должен работать лучше:

while (curNode !=NULL )
...