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à?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top