2011-03-05 16 views
7

रेडएक्सएमएल का उपयोग करके मैं नोड्स के एक सेट के माध्यम से लूप करना चाहता हूं, और ऐसा करने के लिए मुझे सबसे अच्छा तरीका मिल रहा है (भरोसेमंद स्टैक ओवरफ्लो से, दस्तावेज़ में एक उदाहरण नहीं दिखता है यात्रा):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 दो बार कहा जाता है। मैं, यह पिछले नोड पर प्राप्त कर सकते हैं अगर मैं लिखना पाश के बाद:

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

... लेकिन यह है कि कुशल है, और कार्यक्रम उस बिंदु पर इस्तीफा।

पहला प्रश्न: क्या यह मेरे सेटअप (ओएसएक्स 10.6) का एक अद्वितीय फॉबल हो सकता है या मैंने गलत कोड किया है?

दूसरा प्रश्न: क्या किसी के पास रेडएक्सएमएल का उपयोग करते हुए अज्ञात संख्या में एक्सएमएल नोड्स के माध्यम से पुनरावृत्ति करने का सही तरीका है?

धन्यवाद लोग

पीट

+1

invariants के मामले में loops के बारे में सोचो। आपका गैर-नल अगले भाई बहनों के साथ सभी नोड्स के लिए निष्पादित करता है। यह अंतिम नोड के लिए सच नहीं है। –

उत्तर

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

यह कहते हैं, "जबकि वहाँ एक और नोड एक मैं पर काम कर रहा हूँ के बाद छोड़ दिया है।" यही कारण है कि आपका लूप प्रारंभ हो रहा है - जब curNode अंतिम भाई है, तो इसका "next_sibling" पूर्ण होगा। इस परीक्षा में बेहतर काम करना चाहिए:

while (curNode !=NULL) 
+0

धन्यवाद नील (मैंने पहले उस दृष्टिकोण को आजमाया लेकिन rapidxml.hpp (लाइन 1031 बनाम 1.13) में एक बीएडी एक्सेस प्राप्त करने के लिए - aaaaggghh मेरी गलती हालांकि मैं लूप समाप्त होने के बाद एक विशेषता को देखने की कोशिश की थी)। एक बार फिर धन्यवाद। –

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

यह हालांकि rapidxml में एक नोड के सभी बच्चे नोड्स पुनरावृत्ति करने के लिए उचित तरीका है:

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

यदि आप एक यादृच्छिक नोड चुनने वाले हैं तो यह सुविधाजनक नहीं है (उदाहरण के लिए आपको नोड्स की संख्या जानने और ऑफ़सेट एक्स पर एक चुनने की आवश्यकता है) –

+0

@ टोमास डेटा संरचनाओं में हमेशा एक ट्रेडऑफ होता है। पार्सिंग के दौरान तेज़ जोड़ की अनुमति देने के लिए, रेडएक्सएमएल बाल नोड्स और विशेषताओं के लिए लिंक्ड सूचियों का उपयोग करता है। इसलिए, संख्या से प्रत्यक्ष अनुक्रमण संभव नहीं है। लेकिन आपको याद रखना होगा कि rapidxml सुविधा के बारे में नहीं बल्कि प्रदर्शन के बारे में है। – kaalus

+0

मैंने एक ऐसा फ़ंक्शन लिखा है जो आपको (प्रदर्शन हिट की लागत पर) 'std :: vector' बच्चे नोड्स से भरा] देता है] (https://gist.github.com/Darker/4b1ad792ff77a6688388)। जैसे ही दस्तावेज़ पेड़ बदल दिया जाता है, सूची अमान्य है। –

संबंधित मुद्दे