Aumente os problemas da árvore da propriedade e a análise XML
-
22-09-2019 - |
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?
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?