2009-11-25 1 views
7

J'utilise boost::property_tree. La documentation est très vague et globalement inutile pour la plupart. Regarder la source/les exemples n'a pas aidé beaucoup non plus.Boost problèmes d'analyse de l'arborescence des propriétés et Xml

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 également essayé ceci:

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

Même problème. De ma compréhension quand j'appelle ParseEntry je passe une référence à l'arbre à ce noeud.

Y a-t-il un moyen de gérer cela, lorsque j'ai plusieurs entrées de StringTable en utilisant l'arbre des propriétés?

Répondre

14

ParseEntry reçoit une référence à chacun des nœuds enfants du niveau actuel. Vous ne pouvez donc pas demander les valeurs en utilisant le nom de noeud, car vous avez déjà un noeud enfant. Le nom du nœud 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, 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: EN

Nom: DataPath, Valeur: .. \\ Data \\ Resources \\ 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

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

0

Je n'ai pas utilisé l'arbre des propriétés, mais je le ferai probablement car il semble très pratique. Quelques observations rapides cependant:

Le paramètre template de get ne devrait-il pas être le même que le type de retour?

VGHL :: String langName = stringTree.get (...);

Mais ceci n'est probablement pas un problème ici, car cela aurait entraîné une erreur de compilation.

Vous ne savez pas si l'argument L "VGHL.StringTable.Language" fonctionne?

+0

Merci d'avoir souligné cela dans le processus de fusion des bases de code. VGHL et :: Chaîne à la fois Ludo sont typedefs de std :: wstring :) C'était pas le problème :( – UberJumper

+0

Aussi je viens de vérifier que l'éther de travail doenst. Vous pouvez utiliser itérateurs, mais ils seront toujours sur le niveau actuel. – UberJumper

Questions connexes