Question

J'utilise boost::property_tree. La documentation est très vague et dans l'ensemble inutile pour la plupart. En regardant la source / examples n'a pas aidé beaucoup, que ce soit.

Ce que je me demande est la suivante:

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

Comment puis-je itérer sur tous les éléments au niveau actuel? Si je fais ceci:

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

Dans ParseEntry J'essaie ceci:

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

Résultats à une exception (non n'existe pas). J'ai aussi essayé ceci:

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

Le même problème.

Si je comprends bien quand je l'appelle ParseEntry je passe une référence à l'arbre à ce noeud.

Y at-il moyen de faire face à cela, quand j'ai plusieurs entrées de StringTable en utilisant l'arbre de la propriété?

Était-ce utile?

La solution

ParseEntry reçoit une référence à chacun des nœuds enfants du niveau actuel. Donc, vous ne pouvez pas demander aux valeurs en utilisant le nom du nœud, parce que vous avez déjà un nœud enfant. Le nom du noeud est stocké dans v.first .

Vous pouvez itérer sur tous les éléments à un niveau donné en utilisant get_child pour sélectionner le niveau et puis BOOST_FOREACH à itérer. Chaque iterator sera une paire représentant le nom du noeud et les données de noeud:

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

Ce code imprimerait:

  

Nom: Langue, Valeur: FR

     

Nom: DataPath, Valeur: \\ .. \\ données ressources Strings \\ stringtable.bst

Si vous ne voulez pas itérer, vous pouvez sélectionner le niveau de nœud, puis rechercher les noeuds en utilisant leur nom:

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;

Ce code imprimerait:

  

FR

     

.. \\ Ressources de \\ données Strings \\ stringtable.bst

Autres conseils

Je ne l'ai pas utilisé l'arbre de la propriété, mais probablement il semble chouette. Quelques observations rapides cependant:

Si pas le paramètre de modèle d'obtenir le même que le type de retour?

VGHL :: = Chaîne langname stringTree.get (...);

Mais cela est très probablement pas un problème, car cela aurait donné lieu à une erreur de compilation.

Je ne sais pas si L "VGHL.StringTable.Language" œuvres d'argument?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top