8

使用 rapidxml 我想遍历一组节点,并使用我发现的最佳方法来执行此操作(来自可靠的 stackoverflow,文档似乎没有迭代示例):

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 节点的正确方法的示例?

多谢你们

皮特

4

3 回答 3

12

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

xml_node<> *node = ...
for (xml_node<> *child = node->first_node(); child; child = child->next_sibling())
{
    // do stuff with child
}
于 2011-07-16T00:32:20.203 回答
6

这是工作形式的最终代码:

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();
}
于 2011-03-05T11:26:10.350 回答
2
while (curNode->next_sibling() !=NULL )

这表示“在我正在处理的节点之后还剩下一个节点”。这就是为什么你的循环提前停止的原因——当curNode最后一个兄弟是什么时候,它的“ next_sibling”将是 NULL。这个测试应该会更好:

while (curNode !=NULL )
于 2011-03-05T11:07:33.840 回答