C++ yaml cpp解析混合数组/字符串节点时出现问题

C++ yaml cpp解析混合数组/字符串节点时出现问题,c++,parsing,yaml,yaml-cpp,C++,Parsing,Yaml,Yaml Cpp,我在这里测试了以下yaml脚本: 然后我有以下代码: #include <iostream> #include <unistd.h> #include <ctime> #include "yaml-cpp/yaml.h" using namespace std; void load_config() { cout << "loading yaml file\n"; YAML::Node testfile = YAML::Loa

我在这里测试了以下yaml脚本:

然后我有以下代码:

#include <iostream>
#include <unistd.h>
#include <ctime>
#include "yaml-cpp/yaml.h"

using namespace std;

void load_config()
{
    cout << "loading yaml file\n";

    YAML::Node testfile = YAML::LoadFile("BDD-test-case.yaml");
    if (testfile["testcases"])
    {
        cout << "found testfile[\"testcases\"] - size: " << testfile["testcases"].size() << "\n";
        YAML::Node testcases = testfile["testcases"];

        for (int i = 0; i < testcases.size(); i++)
        {
            YAML::Node testcase = testcases[0];
            cout << "testcase " << i << ":\n";
            cout << "\tsize:" << testcase.size() << "\n";
            cout << "\tIsNull:" << testcase.IsNull() << "\n";

            YAML::Node desc = testcase["desc"];
            if (desc)
            {
                std::string desc_str = desc.as<std::string>();
                cout << "desc: " << desc_str.c_str() << "\n";
            }
        }
    }
    cout << "yaml - done\n";
}

int main(int argc, char *argv[])
{
    long double lastTimeMS = time(0)*1000;
    long double CurrTimeMS = time(0)*1000;
    int localPort = 31010;
    int remotePort = 31011;
    int procId = 1;

    load_config();

    cout << "Hello World!" << endl;
    return 0;
}
我试图解析每个测试用例,并打印出“desc”字段的值

从调试中可以看到,我能够找到顶级节点
testcases
。我检查了它的大小,它是2-这是正确的。然后我循环遍历测试用例,并将每个测试用例存储为一个新节点
testcase=testcases[I]
。到现在为止,一直都还不错。但是现在我想看看每个测试用例中都有什么-我应该找到一个tsetcase[“desc”]。。。但我不这么认为。事实上,testcase似乎为空

我做错了什么?

当你抬头看时:

YAML::Node desc = testcase["desc"];
您试图在以下节点中查找
desc
键:

testcase:
  desc: 'TEST TC1'
  requirement-ref: Doors-10.1.1.0
  given:
    text: 'A UUT, TEST2 and TEST are connected'
    devices:
    - Device:
        Type: UUT
        Status: Connected
    - Device:
        Type: TEST
        Status: Connected
    - Device:
        Type: TEST2
        Status: Connected
但是这个节点有一个顶级映射键
testcase
。你可能不是有意的;我想如果你只是简单地取下那把钥匙,那么你的医生就会看起来像你想要的那样

更新

固定YAML(删除了不需要的额外级别的“标签”):


谢谢你;我不太清楚你的意思。。。为了澄清,我希望“desc”是“testcase”的一个子元素。因此,“testcase”被定义为具有描述“desc”、需求引用“requirement ref”和对象“given”的东西,该对象本身将包含子元素。我查看了我在YAML中编写的JSON输出,我相当肯定这就是我想要的。。。。但问题是“testcase”似乎是空的:(文档中指向“desc”的路径是
[“testcases”][0][“testcase”][“desc”]
。您试图将其理解为
[“testcases”][0][“desc”]
。啊……我明白了。因此,也许我的yaml正如您所说的那样是错误的-节点“testcase”似乎不是必需的,但最后我得到的一行只有一个破折号…似乎很奇怪。+1现在,我明天上班时会测试它,并对答案进行投票,谢谢!:)是的,很好,谢谢:)。。。在您的答案上添加了更新,以显示固定的yaml代码。
YAML::Node desc = testcase["desc"];
testcase:
  desc: 'TEST TC1'
  requirement-ref: Doors-10.1.1.0
  given:
    text: 'A UUT, TEST2 and TEST are connected'
    devices:
    - Device:
        Type: UUT
        Status: Connected
    - Device:
        Type: TEST
        Status: Connected
    - Device:
        Type: TEST2
        Status: Connected
testcases:
-   desc: 'TEST TC1'
    requirement-ref: Doors-10.1.1.0
    given:
      text: 'A UUT, TEST2 and TEST are connected'
      devices:
      -   Type: UUT
          Status: Connected
      -   Type: TEST
          Status: Connected
      -   Type: TEST2
          Status: Connected

-   desc: 'TEST TC2'