题
我使用boost::property_tree
。该文档是非常模糊和整体无益的大部分。查看源/例子并没有帮助太多,无论是。
我想知道的是以下内容:
<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
的多个条目使用属性树?
解决方案
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
名称:数据路径,值:.. \\数据\\资源\\字符串\\ 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
其他提示
我不使用属性树,但可能会因为它看起来漂亮。几个简单的观察结果虽然:
不应该获得的模板参数是一样的返回类型?
VGHL ::字符串langname声明= stringTree.get(...);
但是,这是最有可能不是一个问题在这里,因为这会导致编译时错误。
不知道L “VGHL.StringTable.Language” 的说法作品?
不隶属于 StackOverflow