2009-11-25 2 views
7

Sto usando boost::property_tree. La documentazione è molto vaga e in generale poco utile. Anche guardare la fonte/gli esempi non è stato di grande aiuto.Boost Property Boom e problemi di analisi Xml

Quello che mi chiedo è il seguente:

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

Come posso iterare su tutti gli elementi al livello attuale? Se faccio questo:

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

In ParseEntry provo questo:

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

Risultati un'eccezione (non non esiste). Ho anche provato questo:

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

stesso problema.

Dalla mia comprensione quando chiamo ParseEntry sto passando un riferimento all'albero in quel nodo.

C'è un modo per affrontare questo, quando ho più voci di StringTable utilizzando albero delle proprietà?

risposta

14

ParseEntry riceve un riferimento a ciascuno dei nodi figli del livello corrente. Quindi, non puoi chiedere i valori usando il nome del nodo, perché hai già un nodo figlio. Il nome del nodo viene memorizzato in v.first.

È possibile iterare su tutti gli elementi di un dato livello utilizzando get_child per selezionare il livello e poi BOOST_FOREACH per scorrere. Ogni iteratore sarà una coppia che rappresenta il nome del nodo ed i dati 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; 
} 

Questo codice stampa:

Nome: Lingua, Valore: EN

Nome: DataPath, Valore: .. \\ Data \\ Resources \\ Strings \\ stringtable.BST

Se non si desidera iterare, è possibile selezionare il livello di nodo e quindi cercare i nodi usando il loro nome:

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; 

Questo codice stampa:

IT

.. \\ dati \\ Risorse \\ Strings \\ stringtable.bst

0

Non ho usato l'albero delle proprietà, ma probabilmente lo sarà come sembra elegante. Alcune osservazioni veloci però:

Non dovrebbe il parametro di modello di ottenere essere uguale al tipo di ritorno?

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

Ma questo probabilmente non è un problema qui, poiché ciò avrebbe comportato un errore in fase di compilazione.

Non sono sicuro se L argomento "VGHL.StringTable.Language" funzioni?

+0

Grazie per averlo indicato fondamentalmente nel processo di unione di basi di codici. VGHL e Ludo :: String entrambi sono typedef di std :: wstring :) che non era il problema :( – UberJumper

+0

Inoltre ho appena controllato, che doenst lavoro etere. È possibile utilizzare gli iteratori, ma saranno sempre in il livello attuale. – UberJumper