2012-03-24 5 views
0

Ich möchte hierarchische Daten mit Yaml machen, leider bin ich nicht viel an dieses Format gewöhnt, aber ich würde es gerne verwenden, weil es menschlich freundlich ist.Ich habe eine harte Zeit mit yaml

Hier ist meine yaml:

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

Ich verwende yaml-CPP und wenn ich doc["items"]["list1"]["itemA"] tun, ich am Ende mit Ausnahme TypedKeyNotFound, und ich glaube nicht, dass ich gut verstehen, wie YAML soll verwendet werden, ich mache

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

aber ich habe immer noch diese Ausnahme.

+1

schöner Ruf, haha, ich werde Sie nicht nur upvote es so zu halten: P – Castilho

+0

Können Sie ein vollständiges (small) Beispiel posten, die dies demonstriert? Zeigen Sie insbesondere, wie Sie die YAML laden. Stellen Sie außerdem sicher, dass Sie in der YAML-Datei Leerzeichen und keine Tabulatoren verwenden. –

+0

Das YAML sieht mir gefälscht –

Antwort

1

Nun, ich habe es geschafft, besser zu verstehen, wie yaml funktioniert, und auch, wie es geparst werden kann. Ich möchte keine Daten wie diese erhalten ["fdfds"] ["frwrew"] ["vbxvxc"], weil ich nicht möchte, dass ich den Schlüssel vor dem Parsen kenne. Es ist mir gelungen, einen Code zu erstellen, der die Struktur eines Dokuments zeigt, hauptsächlich mit Karten und Sequenzen, hier ist es.

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