2009-11-25 15 views
7

मैं boost::property_tree का उपयोग कर रहा हूं। अधिकांश भाग के लिए प्रलेखन बहुत अस्पष्ट और समग्र रूप से अनुपयोगी है। स्रोत/उदाहरणों को देखते हुए, इससे भी ज्यादा मदद नहीं मिली।बूस्ट प्रॉपर्टी ट्री और एक्सएमएल पार्सिंग समस्याएं

<VGHL> 
    <StringTable> 
     <Language>EN</Language> 
     <DataPath>..\\Data\\Resources\\Strings\\stringtable.bst</DataPath> 
    </StringTable> 
</VGHL> 

मैं वर्तमान स्तर पर सभी तत्वों से अधिक कैसे पुनरावृति कर सकते हैं:

क्या मैं सोच रहा हूँ पीछा कर रहा है? मैं ऐसा करते हैं तो: एक अपवाद में

VGHL::String langName = stringTree.get<VGHL::String>(L"StringTable.Language"); 

परिणाम (मौजूद नहीं है नहीं):

read_xml(fin, bifPropTree); 
VGHL::String tablePath; 
BOOST_FOREACH(boost::property_tree::wiptree::value_type &v, 
       bifPropTree.get_child(L"VGHL.StringTable")) 
{ 
    m_StringTable->ParseEntry(v.second, tablePath); 
} 

ParseEntry में मैं यह कोशिश। मैंने यह भी कोशिश की है:

VGHL::String langName = stringTree.get<VGHL::String>(L"Language"); 

वही समस्या।

मेरी समझ से जब मैं ParseEntry पर कॉल करता हूं तो मैं उस नोड पर पेड़ का संदर्भ पास कर रहा हूं।

क्या इससे निपटने का कोई तरीका है, जब मेरे पास संपत्ति पेड़ का उपयोग करके StringTable की एकाधिक प्रविष्टियां हैं?

उत्तर

14

पारसेन्ट्री को वर्तमान स्तर के बच्चों के प्रत्येक नोड का संदर्भ प्राप्त होता है। इसलिए, आप नोड नाम का उपयोग करके मानों से नहीं पूछ सकते हैं, क्योंकि आपके पास पहले से ही एक बच्चा नोड है। नोड नाम v.first में संग्रहीत किया जाता है।

आप get_child का उपयोग कर के स्तर का चयन करने के लिए एक दिया स्तर पर सभी तत्वों से अधिक पुनरावृति कर सकते हैं और फिर BOOST_FOREACH पुनरावृत्ति करने के लिए। , Datapath:

using boost::property_tree::wiptree; 

wiptree &iterationLevel = bifPropTree.get_child(L"VGHL.StringTable"); 
BOOST_FOREACH(wiptree::value_type &v, iterationLevel) 
{ 
    wstring name = v.first; 
    wstring value = v.second.get<wstring>(L""); 
    wcout << L"Name: " << name << L", Value: " << value.c_str() << endl; 
} 

इस कोड को प्रिंट होगा::

नाम: भाषा, मान: एन

नाम प्रत्येक इटरेटर एक जोड़ी नोड के नाम और नोड डेटा का प्रतिनिधित्व किया जाएगा मान: .. \\ डेटा \\ संसाधन \\ स्ट्रिंग्स \\ स्ट्रिंगटेबल।BST

आप पुनरावृति नहीं करना चाहते हैं, तो आप नोड स्तर का चयन कर सकते हैं और फिर अपने नाम का उपयोग नोड्स के लिए देखो:

wiptree &iterationLevel = bifPropTree.get_child(L"VGHL.StringTable"); 
wstring valueLang = iterationLevel.get<wstring>(L"Language"); 
wstring valuePath = iterationLevel.get<wstring>(L"DataPath"); 
wcout << valueLang << endl << valuePath << endl; 

इस कोड को प्रिंट होगा:

एन

.. \\ डाटा \\ संसाधन \\ स्ट्रिंग्स \\ stringtable.bst

0

मैंने संपत्ति के पेड़ का उपयोग नहीं किया है, लेकिन शायद यह निफ्टी दिखता है। हालांकि कुछ त्वरित अवलोकन:

क्या टेम्पलेट पैरामीटर रिटर्न प्रकार के समान नहीं होना चाहिए?

वीजीएचएल :: स्ट्रिंग langName = stringTree.get (...);

लेकिन यह संभवतः यहां कोई समस्या नहीं है, क्योंकि इसका परिणाम संकलन-समय त्रुटि में हुआ होगा।

सुनिश्चित नहीं है कि एल "VGHL.StringTable.Language" तर्क काम करता है?

+0

मूल रूप से कोडबेस को विलय करने की प्रक्रिया में इंगित करने के लिए धन्यवाद। VGHL और लूडो :: स्ट्रिंग दोनों std :: wstring :) की typedefs हैं यही समस्या :( – UberJumper

+0

इसके अलावा मैं सिर्फ जाँच नहीं था, कि doenst काम ईथर। आप iterators उपयोग कर सकते हैं, लेकिन वे हमेशा पर होगा वर्तमान स्तर – UberJumper

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