rapidxml:如何遍历节点?留下最后的兄弟姐妹

时间:2011-03-05 10:52:51

标签: c++ iterator rapidxml

使用rapidxml我想循环一组节点,并且使用我发现的最好的方法(从可靠的stackoverflow,doc似乎没有迭代的例子):

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)还是我的编码错误?

第二个问题:有没有人有一个他们认为使用rapidxml迭代未知数量的XML节点的正确方法的例子?

谢谢你们

皮特

3 个答案:

答案 0 :(得分:12)

这是在rapidxml中迭代遍历节点的所有子节点的正确方法:

xml_node<> *node = ...
for (xml_node<> *child = node->first_node(); child; child = child->next_sibling())
{
    // do stuff with child
}

答案 1 :(得分:5)

以下是工作形式的最终代码:

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();
}

答案 2 :(得分:1)

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

这说“虽然在我工作的节点之后还剩下一个节点”。这就是你的循环提前停止的原因 - 当curNode是最终兄弟时,它的“next_sibling”将为NULL。这个测试应该更好:

while (curNode !=NULL )