2016-09-19 54 views
1

我有以下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似乎爲空...

我在這裏做錯了什麼?

回答

1

當你看到了:

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」似乎不是必需的,但是最後我得到一條只有'-'破折號的行......看起來很奇怪。現在,當我明天開始工作時,我會測試它,並讚揚答案,謝謝!:) –