2009-11-25 111 views
7

我使用的是boost::property_tree。文件非常模糊,大部分對整體無益。查看源代碼/示例也沒有太大的幫助。Boost屬性樹和Xml解析問題

什麼我不知道是這樣的:

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

我如何可以遍歷在當前水平的所有元素?如果我這樣做:

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"StringTable.Language"); 

結果異常(不是不存在)。我也試過這個:

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

同樣的問題。

根據我的理解,當我呼叫ParseEntry時,我傳遞了該節點樹的引用。

有沒有什麼辦法來解決這個問題,當我有多個使用屬性樹StringTable的條目?

回答

14

ParseEntry接收對當前級別的每個子節點的引用。因此,您不能使用節點名稱詢問值,因爲您已經有了一個子節點。節點名稱存儲在v.first中。

可以遍歷在使用get_child選擇水平給定級別的所有元素,然後BOOST_FOREACH進行迭代。每個迭代將表示節點的名字和節點的數據對:

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; 
} 

此代碼將打印:

名稱:語言,價值:EN

名稱:數據路徑值:.. \\ Data \\ Resources \\ Strings \\ stringtable。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; 

此代碼將打印:

EN

.. \\ \\的數據資源\\ \\字符串stringtable.bst

0

我沒有使用屬性樹,但可能會因爲它看起來很漂亮。幾個快速的觀察,雖然:

get的模板參數不應與返回類型相同嗎?

VGHL :: String langName = stringTree.get(...);

但是這在這裏很可能不是問題,因爲這會導致編譯時錯誤。

不確定L「VGHL.StringTable.Language」參數是否有效?

+0

感謝基本上指向表示出來IM在合併代碼庫的過程。 VGHL和魯:: string的都是標準:: wstring的:)的類型定義 這wasnt問題:( – UberJumper 2009-11-25 04:13:59

+0

另外我剛纔檢查,這doenst工作醚。 可以使用迭代器,但他們將永遠是目前的水平。 – UberJumper 2009-11-25 13:18:04