2009-11-25 112 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