2015-09-10 5 views
5

Я пытаюсь разобрать yaml usign yaml-cpp. Это мой YAML:Parsing yaml with 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 

Когда я

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; 

я получаю сообщение: "Высота узла не существует". Как я могу получить доступ к этому полю (и другим?)

Спасибо большое!

ответ

4

Синтаксис, который вы использовали с -, создает элементы массива. Это означает, что вы создаете (в формате JSON нотации):

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

Но что вы хотите:

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

К счастью, решение легко. Просто удалите ошибочные - символ:

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

Обратите внимание, что я также фиксированной опечатку widht ширины и удалить посторонний пробел перед version: 1.0

Если вам интересно, как вы бы на самом деле получить доступ к вашей конфигурации, как сейчас, вам нужно будет сделать доступ к массиву:

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

Очевидно, что это будет рате r неприятный, если вы действительно хотели, чтобы это было так, потому что это означает, что вы больше не используете ключи, но должны либо иметь информацию о заказе, либо переработать конфигурацию, чтобы избавиться от уровня массива.

+0

спасибо @Corbin за чистую голову! он отлично работает! Я не нашел очень много документации и примеров! – jmoren