如何将YAML节点中的序列作为字符串返回?

时间:2019-04-17 14:55:01

标签: c++ yaml yaml-cpp

我正在尝试使用yaml-cpp解析C ++中的对话树(YAML)。这是一个示例YAML:

dialogue_block:
  character_name:
    - Hello
    - How are you?
    - :main
main:
  - 1: ["I'm fine, thank you", :response1]
  - 2: ["Not very well", :response2]
  - 3: ["I don't want to talk", :exit]

我对C ++和Yaml还是比较陌生,因此,如果有更简单/更直观的方法,请向正确的方向指出。我的想法是将每个块存储为对话节点。在上面的示例中,我希望能够调用dialogue_block,并提取character_name以标识正在说话的字符,将所有序列打印到:main,然后在其中切换到main节点,并为播放器提供3个选择。我目前停留在步骤1-解析yaml文件...

以下作品...

YAML::Node dialogue = YAML::LoadFile("dialogue.yaml");
if(dialogue["dialogue_block"]){
  std::cout << dialogue["dialogue_block"]["character_name"][0].as<std::string>() << "\n";
}

,并显示“ Hello”。但是,我陷入了下一步:如何在不将字符串硬编码到代码中的情况下检索“ character_name”?有没有办法打印出所有导致但不包括“:main”的字符串?然后使“主”成为下一个节点?

第一次在stackoverflow上发帖,所以请告知我是否需要更多信息!谢谢。

编辑: 这是我正在使用的更新代码:

// read in file
YAML::Node dialogue = YAML::LoadFile("dialogue.yaml");

// Extract names of each block
std::vector<std::string> dialogueBlocks;
for (const auto& kv : dialogue) {
    dialogueBlocks.push_back(kv.first.as<std::string>());
} // will return "dialogue_block" and "main" 

std::string character;

// if first_encounter exists, always start at that block
if(dialogue["first_encounter"]){
    for(YAML::iterator it = dialogue["first_encounter"].begin(); it != dialogue["first_encounter"].end(); ++it){
        character = it->first.as<std::string>();
        std::cout << "\nCharacter: " << character << "\n";
        for (YAML::iterator it=dialogue["first_encounter"][character].begin();it!=dialogue["first_encounter"][character].end(); ++it) {
        std::cout << it->as<std::string>() << "\n";
    }
    }

}

我可以成功提取角色名称和对话,但是我在努力解决一些问题: 1)它还打印“:main”,我希望它省略。我不确定在到达以“:”开头的字符串时,或者是否有合适的内置函数要使用时,如何终止它。 2)将“:main”存储为被调用时通过for循环的下一个块。

1 个答案:

答案 0 :(得分:0)

您在问如何找到列表的“键名”。您当然可以查看dialogue["dialogue_block"]下的所有键,但是像这样将characterlines分开的字段会变得更加惯用了。

dialogue_block:
  character: Bob
  lines:
    - Hello
    - How are you?
    - :main

,或者如果一个块打算用作列表,

dialogue_block:
  - character: Bob
    lines:
      - Hello
      - How are you?
      - :main
  - character: Alice
    lines:
      - Blah
      - :main