2016-08-24 37 views
3

我有一個測試yaml文件,我試圖用yaml-cpp解析。困惑於YAML :: NodeType ::未定義與yaml-cpp

test.yaml

testConfig: 
    # this points to additional config files to be parsed 
    includes: 
     required: "thing1.yaml" 
     optional: "thing2.yaml" 
    #some extraneous config information 
    foo: 42 
    bar: 394 
    baz: 8675309 

我解析它,我得到的回報testConfig.Type()YAML::NodeType::Map。這是預期的行爲。

然後,我嘗試解析包含以獲取必需值或可選值,我無法迭代,因爲includes.Type()返回YAML::NodeType::Undefined。我對yaml和yaml-cpp非常陌生,所以任何幫助向我展示我出錯的地方將不勝感激。

解析代碼:

{includes and other such nonsense} 
      . 
      . 
      . 
YAML::Node configRoot = YAML::LoadFile(path.c_str()); 
if(configRoot.IsNull()) 
{ 
    SYSTEM_LOG_ERROR("Failed to load the config file: %s.", 
        path.c_str()); 
    return false; 
} 

YAML::Node includes = configRoot["includes"]; 
/* ^^^^^^^^^^^^^^^ 
* I believe that here lies the issue as includes is undefined and 
* therefore I cannot iterate over it. 
*/ 
for(auto it = include.begin(); it != include.end(); ++it) 
{ 
    // do some fantastically brilliant CS voodoo! 
} 
      . 
      . 
      . 
{ more C++ craziness to follow } 

SOLUTION: 我除去不必要的頂層configTest這樣我可以解析包括如我需要。

+0

沒有必要在你的YAML文件中加入引用'thingX.yaml' – Anthon

+0

@安永謝謝你的信息...我習慣了json,似乎幾乎所有東西都需要引號。 – CompSciGuy139

回答

1

您現在看到的configRoot["includes"],但在你的地圖頂層關鍵是testConfig。改爲使用configRoot["testConfig"]

+0

我剛剛發現這個,並即將發表評論!感謝您及時的回覆。我剛剛刪除了多餘的頂級testConfig。 – CompSciGuy139

2

那麼,您的頂級YAML文檔確實不包含名爲includes的密鑰。它只包含一個名爲testConfig的密鑰。你應該訪問第一:

// ... 
YAML::Node configRoot = YAML::LoadFile(path.c_str())["testConfig"]; 
// ... 

或者,如果你想明確地檢查是否存在testConfig

// ... 
YAML::Node configRoot = YAML::LoadFile(path.c_str()); 
// do check her as in your code 
YAML:Node testConfig = configRoot["testConfig"]; 
// check if testConfig is a mapping here 
YAML::Node includes = testConfig["includes"]; 
// ...