2012-03-24 17 views
0

yamlで階層的なデータを作りたいと思っていますが、残念ながらこのフォーマットにあまり慣れていませんが、人にやさしいので使いたいです。ここで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() 

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

+1

素敵な評判、ハハ、私はそのようにそれを維持するだけであなたをupvoteしません:P – Castilho

+0

はあなたがこれを証明する完全な(小さな)の例を投稿することができますか?特に、YAMLの読み込み方法を示します。また、YAMLファイルのインデント用に、タブではなくスペースを使用していることを確認してください。 –

+0

YAMLが私に偽って見える –

答えて

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