2015-09-10 15 views
5

Sto cercando di analizzare un yaml usign yaml-cpp. Questo è il mio YAML:Parsing yaml con yaml cpp

--- 
configuration: 
    - height: 600 
    - widht: 800 
    - velocity: 1 
    - scroll: 30 
types: 
    - image: resources/images/grass.png 
    name: grass 
    - image: resources/images/water.png 
    name: water 
version: 1.0 

Quando faccio

YAML::Node basenode = YAML::LoadFile("./path/to/file.yaml"); 
int height; 
if(basenode["configuration"]) 
    if(basenode["configuration"]["height"] 
     height = basenode["configuration"]["height"].as<int>(); 
    else 
     cout << "The node height doesn't exist" << endl; 
else 
    cout << "The node configuration doesn't exist" << endl; 

Sto ottenendo il messaggio: "L'altezza del nodo non esiste". Come posso accedere a quel campo (e agli altri?)

Grazie mille!

risposta

4

La sintassi che è stata utilizzata con - crea elementi di array. Ciò significa che si sta creando (in notazione JSON):

{configuration: [{height: 600}, {width: 800}, {velocity: 1}, {scroll: 30}]} 

Ma quello che vuoi è:

{configuration: {height: 600, width: 800, velocity: 1, scroll: 30}} 

Per fortuna la soluzione è semplice. Basta togliere le erronee - personaggi:

--- 
configuration: 
    height: 600 
    width: 800 
    velocity: 1 
    scroll: 30 
types: 
    - image: resources/images/grass.png 
    name: grass 
    - image: resources/images/water.png 
    name: water 
version: 1.0 

Si noti che ho anche corretto un errore di battitura di widht alla larghezza e rimosso uno spazio estraneo prima version: 1.0

Se vi state chiedendo come si farebbe in realtà accedere alla configurazione di come è ora, che avrebbe dovuto fare un accesso agli array:

int height = basenode["configuration"][0]["height"].as<int>(); 
int height = basenode["configuration"][1]["width"].as<int>(); 

Ovviamente questo sarebbe Rathe r brutto se in realtà lo si desidera in questo modo, dal momento che significa che non è più possibile utilizzare le chiavi, ma che devono avere problemi di ordine o rielaborare la configurazione per eliminare il livello dell'array.

+0

grazie @Corbin per schiarirsi le idee! funziona alla grande! Non ho trovato molta documentazione ed esempi! – jmoren