我使用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” 的说法作品?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top