Boost Albero Proprietà e XML Problemi di analisi
-
22-09-2019 - |
Domanda
sto usando boost::property_tree
. La documentazione è molto vago e nel complesso inutile per la maggior parte. Guardando alla fonte / esempi non ha aiutato più di tanto, sia.
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 in un'eccezione (non non esiste). Ho anche provato questo:
VGHL::String langName = stringTree.get<VGHL::String>(L"Language");
Lo stesso problema.
Dalla mia comprensione quando chiamo ParseEntry
sto passando un riferimento alla albero a quel nodo.
C'è un modo per far fronte a questo, quando ho più voci di StringTable
usando albero di proprietà?
Soluzione
ParseEntry riceve un riferimento a ciascuno dei figli nodi del livello attuale. Quindi, non si può chiedere i valori utilizzando il nome del nodo, perché avete 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 quindi BOOST_FOREACH per scorrere. Ogni iteratore sarà una coppia che rappresenta il nome del nodo e il nodo dati:
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: IT
Nome: DataPath, Valore: .. \\ dati \\ Risorse \\ 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
Altri suggerimenti
Non ho usato l'albero di proprietà, ma probabilmente come sembra carino. Alcune osservazioni veloce però:
Non dovrebbe il parametro di template di ottenere sia lo stesso del tipo di ritorno?
VGHL :: String = langName stringTree.get (...);
Ma questo è più probabile non è un problema qui, in quanto ciò avrebbe comportato errore di compilazione.
Non sono sicuro se L "VGHL.StringTable.Language" opere di argomento?