Pergunta

estou a usar boost::property_tree. A documentação é muito vaga e inútil em geral. Olhar para a fonte/exemplos também não ajudou tanto.

O que estou me perguntando é o seguinte:

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

Como posso iterar sobre todos os elementos no nível atual? Se eu fizer isso:

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

Dentro ParseEntry Eu tento o seguinte:

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

Resultados em uma exceção (não existe). Eu também tentei o seguinte:

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

Mesmo problema.

Pelo meu entendimento quando eu ligo ParseEntry Estou passando uma referência à árvore nesse nó.

Existe alguma maneira de lidar com isso, quando tenho várias entradas de StringTable Usando a árvore de propriedades?

Foi útil?

Solução

Parseentry recebe uma referência a cada um dos nós das crianças do nível atual. Portanto, você não pode perguntar os valores usando o nome do nó, porque você já tem um nó filho. O nome do nó é armazenado em V.First.

Você pode iterar sobre todos os elementos em um determinado nível usando get_child para selecionar o nível e depois Boost_foreach para iterar. Cada iterador será um par representando o nome do nó e os dados do nó:

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

Este código imprimiria:

Nome: Idioma, Valor: EN

Nome: Datapath, Valor: .. Data Resources Strings Stringtable.bst

Se você não quiser iterar, pode selecionar o nível do nó e procurar os nós usando o nome dele:

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;

Este código imprimiria:

En

.. data Resources strings stringtable.bst

Outras dicas

Eu não usei a árvore de propriedades, mas provavelmente o fará como parece bacana. Algumas observações rápidas:

O parâmetro de modelo não deve ser o mesmo que o tipo de retorno?

Vghl :: string langname = stringtree.get (...);

Mas isso provavelmente não é um problema aqui, pois isso resultaria em erro de tempo de compilação.

Não tem certeza se o argumento "vghl.StringTable.Language" funciona?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top