Тяжело с yaml

Я хочу сделать иерархические данные с помощью yaml, к сожалению, я не очень привык к этому формату, но я хотел бы использовать его, потому что он удобен для человека.

Вот мой ямл:

items:
    list1:
        itemA:
            item property a
        itemB:
    list2:
        itemC:
        itemD:

Я использую yaml-cpp, и когда я делаю doc["items"]["list1"]["itemA"], я получаю исключение TypedKeyNotFound, и я не думаю, что хорошо понимаю, как предполагается использовать yaml, я понимаю

doc["items"]["list1"]["itemA"].Type()

но у меня все еще есть это исключение.


person jokoon    schedule 24.03.2012    source источник
comment
хорошая репутация, ха-ха, я не буду голосовать за вас, просто чтобы она оставалась такой: P   -  person Castilho    schedule 25.03.2012
comment
Можете ли вы опубликовать полный (небольшой) пример, демонстрирующий это? В частности, покажите, как вы загружаете YAML. Кроме того, убедитесь, что вы используете пробелы, а не табуляцию для отступов в файле YAML.   -  person Jesse Beder    schedule 25.03.2012
comment
Это действительный YAML? Я не могу понять, что это должно представлять.   -  person David Heffernan    schedule 25.03.2012
comment
@David, это действительно YAML - что не так? (помните, что нулевые узлы разрешены)   -  person Jesse Beder    schedule 25.03.2012


Ответы (1)


Что ж, мне удалось лучше понять, как работает yaml, а также как его можно парсить. Я не хочу получать такие данные, как ["fdfds"]["frwrew"]["vbxvxc"], потому что не хочу требовать знать ключ перед синтаксическим анализом. Мне удалось сделать код, который показывает структуру документа, используя в основном карты и последовательности, вот он.

int spaces = 0; // define it in global scope, since unroll is a recursive function.
void unroll(const YAML::Node & node)
{
switch(node.Type())
{
    case YAML::NodeType::Map:       
    {
        for(auto it = node.begin(); it != node.end(); ++ it)
        {
            string s; it.first() >> s;
            indent();
            cout << s << "\n";
            const YAML::Node & dada = it.second();
            spaces ++;
            unroll(dada);
            spaces--;
            cout << "\n";
        }
        break;
    }

    case YAML::NodeType::Scalar:
    {
        indent();
        string s; node >> s;
        cout << "found scalar " << s << "\n";
        break;
    }
    case YAML::NodeType::Null:
    {
        indent();
        cout << "null";
        break;
    }
    case YAML::NodeType::Sequence:
    {
        //cout << "sequence";
        for(auto it = node.begin(); it != node.end(); ++ it)
        {
            string s; *it >> s;
            indent();
            cout << s << "\n";
        }
        break;
    }
    default: cout << "error: undefined";    break;
}
}
person jokoon    schedule 29.03.2012