2009-11-25 15 views
7

Estoy usando boost::property_tree. La documentación es muy vaga y en general no es útil en su mayor parte. En cuanto a la fuente/ejemplos tampoco ayudó mucho.Boost Property Tree y Xml parsing Problems

Lo que me pregunto es la siguiente:

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

Como puedo iterar sobre todos los elementos en el nivel actual? Si hago esto:

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

En ParseEntry de que este intento:

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

Resultados en una excepción (no no existe). También probé esto:

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

Mismo problema.

Según entiendo cuando llamo al ParseEntry, estoy haciendo una referencia al árbol en ese nodo.

¿Hay alguna forma de solucionar esto, cuando tengo varias entradas de StringTable usando el árbol de propiedades?

Respuesta

14

ParseEntry recibe una referencia a cada uno de los nodos secundarios del nivel actual. Por lo tanto, no puede solicitar los valores utilizando el nombre del nodo, porque ya tiene un nodo secundario. El nombre del nodo se almacena en v.first.

Usted puede iterar sobre todos los elementos en un determinado nivel usando get_child para seleccionar el nivel y luego BOOST_FOREACH iterar. Cada repetidor será un par que representa el nombre del nodo y los datos del nodo:

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 imprimiría:

Nombre: Idioma, Valor: ES

Nombre: DataPath, Valor: .. \\ Data \\ Resources \\ Strings \\ stringtable.BST

Si no desea repetir, se puede seleccionar el nivel de nodo y luego buscar los nodos usando su nombre:

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 imprimiría:

ES

.. \\ cadenas de datos \\ \\ \\ Recursos stringtable.bst

0

No he usado el árbol de propiedades, pero probablemente lo parezca, ya que parece ingenioso. Sin embargo, algunas observaciones rápidas:

¿No debería ser el parámetro de la plantilla el mismo que el tipo de devolución?

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

Pero lo más probable es que esto no sea un problema, ya que esto habría ocasionado un error en tiempo de compilación.

¿No está seguro de si el argumento L "VGHL.StringTable.Language" funciona?

+0

Gracias por señalar eso estoy básicamente en el proceso de fusionar las bases de código. VGHL y Ludo :: string tanto son typedefs de std :: :) wstring Eso no era el problema :( – UberJumper

+0

También acabo de comprobar, que doenst éter trabajo. Puede utilizar iteradores, pero siempre estará en el nivel actual. – UberJumper