2011-03-05 16 views
7

rapidxml Kullanarak bir dizi düğümler arasında geçiş yapmak istiyorum ve bunu yapmak için en iyi yol olduğunu bulduğumu kullanıyorum (güvenilir stackoverflow'dan, dokümanın yineleme):rapidxml: düğümler boyunca yineleme nasıl? Son kardeşi bırakıyor

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

Maalesef, benim OSX 10.6 bu son eş düğüme dışarıda bırakarak olduğunu - döngünün son tekrarında, next_sibling iki kez denir çünkü sanırım.

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

... ama bu çok tehlikeli olduğunu ve program bu noktada çıkar: Ben yazarsam döngü sonra, bu son düğümde alabilirsiniz.

İlk soru: Bu, kurulumumun (OSX 10.6) benzersiz bir dayanağı olabilir mi, yoksa yanlış kodladım mı?

İkinci soru: Herkesin, hızlı bir şekilde XML kullanarak bilinmeyen sayıda XML düğümüyle yineleme yapmanın doğru yolu olduğuna dair bir örneği var mı?

Teşekkürler çocuklar

Pete

+1

Döngüleri invaryantlar açısından düşünün. Sizinki NULL olmayan sonraki kardeşler ile tüm düğümleri yürütür. Bu son düğüm için geçerli değil. –

cevap

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

Bu diyor "Üzerinde çalıştığım bir sonra yaptı bir daha düğüm varken". İşte bu yüzden döngünün erken kalkıyor - curNode son kardeş ise "next_sibling" NULL olacak. Bu test daha iyi çalışması gerekir:

while (curNode !=NULL) 
+0

Teşekkürler Neil (Ben bu yaklaşımı daha önce denedim ama fastxml.hpp'de BAD ERİŞİMİ al (satır 1031 v 1.13) - hatayı bitirdikten sonra bir öznitelik bulmaya çalışsam da hatam aaaaggghh. Tekrar teşekkürler. –

5

Burada çalışan formda nihai kod:

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

Gerçi rapidxml bir düğümün tüm alt düğümleri yineleme için doğru yolu:

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

Tek bir rasgele düğüm seçmek üzereyseniz (örn. Düğüm sayısını bilmeniz ve X ofsetinden birini seçmeniz gerekiyorsa) bu uygun değildir. –

+0

@Tomas Her zaman veri yapılarında bir değişiklik vardır. Ayrıştırma sırasında hızlı ekleme sağlamak için, quickxml alt düğümleri ve öznitelikleri için bağlantılı listeler kullanır. Bu nedenle, sayıya göre doğrudan indeksleme mümkün değildir. Ama şunu hatırlatmalısın ki, rapidxml kolaylık değil performans hakkında. – kaalus

+0

Bir [işlev size (performans çarpma pahasına) 'std :: vector' çocuk düğümleri dolu] veren bir işlev yazdım (https://gist.github.com/Darker/4b1ad792ff77a6688388). Belge ağacı değiştirildiğinde, liste geçersizdir. –

İlgili konular