2010-10-09 5 views
3

Почему этот цикл работает только один раз? noteDatabaseItem просто берет узел и заполняет данные. xml имеет 3 примечания в нем.Почему этот цикл работает только один раз?

XML:

<?xml version="1.0" encoding="utf-8"?> 
<noteCollection> 
    <note name="Test Note 1">This is test note 1 content!</note> 
    <note name="Test Note 2">This is test note 2 content!</note> 
    <note name="Test Note 3">This is test note 3 content!</note> 
</noteCollection> 

C++:

std::vector<notekeeper::noteDatabaseItem> noteList; 
TiXmlElement* noteCollection = xmlDoc->FirstChildElement("noteCollection"); 
TiXmlElement* node = noteCollection->FirstChildElement("note"); 
int itemCount = 0; 

while (node != NULL) { 
    itemCount++; 
    noteList.resize(itemCount); 
    noteList.push_back(noteDatabaseItem(node)); 
    node = noteCollection->NextSiblingElement("note"); 
} 
+4

Почему вы «изменяете размер» перед тем, как «push_back»? Он изменяет размеры. Возможно, последняя строка должна быть «node = note-> NextSiblingElement (« note »);'? – GManNickG

+0

Загруженный XML выше, и есть 3 примечания, поэтому нет 1, и изменение размера является ошибкой. – Will03uk

+0

node = node-> NextSiblingElement ("note"); работал. – Will03uk

ответ

9

это не должно быть node = node->NextSiblingElement("note")?

noteCollection имеет детей, а не братьев и сестер, не так ли?

3

Вы получаете неправильный элемент в своем цикле. Попробуйте следующее:

while (node != NULL) { 
    itemCount++; 
    noteList.push_back(noteDatabaseItem(node)); 
    node = node->NextSiblingElement("note"); 
} 

Следующий родственник текущего узла - тот, который вы хотите. Вы пытались получить следующего брата родительского узла.

1
node = noteCollection->NextSiblingElement("note"); 

предназначается, чтобы быть

node = node->NextSiblingElement("note"); 

Глупая ошибка. Сиблинг не ребенок.

+2

Вы должны принять ответ GoTo, а не повторно опубликовать его. (т. е. удалить этот ответ.) – GManNickG

Смежные вопросы