0

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

しかし、私にはまだこの例外があります。

4

1 に答える 1

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;
}
}
于 2012-03-29T17:05:54.993 に答える