YAML-CPP麻烦解析混合阵列/串节点

问题描述:

我有以下YAML脚本,我在这里测试:online yaml parserYAML-CPP麻烦解析混合阵列/串节点

testcases: 
- 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: # next test case... 
    desc: 'TEST TC2' 

然后,我有以下代码:

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

我得到的以下输出:

loading yaml file 
found testfile["testcases"] - size: 2 
testcase 0: 
     size:1 
     IsNull:0 
testcase 1: 
     size:1 
     IsNull:0 
yaml - done 
Hello World! 

我想解析每个测试用例并打印出“desc”字段。

从调试中可以看到,我能够找到顶级节点testcases。我检查它的大小,它是2 - 这是正确的。然后我遍历测试用例,并将它们分别存储为新节点testcase = testcases[i]。到现在为止还挺好。但是现在我想看看每个测试用例里面有什么 - 我应该找到一个tsetcase [“desc”] ......但我没有看到。 Infact 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(删除不打算 '标签' 的额外级):

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' 
+0

谢谢你提供的;我不太清楚你的意思......为了澄清,我希望“desc”是“testcase”的一个子元素。因此,“测试用例”被定义为具有描述“desc”,需求引用“require-ref”和称为“给定”的对象,其本身将包含子元素。我查看了我在YAML中编写的JSON输出,并且我相当确定这是我想要的......但问题是“testcase”显示为空:( –

+0

在文档中“desc”的路径是'[“testcases”] [0] [“testcase”] [“desc”]'你试图将它读作'[“testcases”] [0] [“desc”]' –

+0

Ahhh .. ..我明白了,所以也许我的yaml是错误的,正如你所说 - 节点“testcase”似乎不是必需的,但是最后我得到一条只有'-'破折号的行......看起来很奇怪。现在,当我明天开始工作时,我会测试它,并赞扬答案,谢谢!:) –