8

Rapidxmlを使用して、ノードのセットをループしたいと思っています。これを行うための最良の方法であることがわかったものを使用しています(信頼できるスタックオーバーフローから、ドキュメントには反復の例がないようです)。

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が2回呼び出されるためだと思います。ループの後に書くと、この最後のノードに到達できます。

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

...しかし、それは危険であり、プログラムはその時点で終了します。

最初の質問:これは私のセットアップ(OSX 10.6)のユニークなものでしょうか、それとも間違ってコーディングしたのでしょうか?

2番目の質問: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 )

これは、「作業中のノードの後に​​もう 1 つのノードが残っている間」という意味です。それがあなたのループが早期に停止する理由です -curNodeが最後の兄弟である場合、その " next_sibling" は NULL になります。このテストはうまくいくはずです:

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