被 YAML::NodeType::Undefined 与 yaml-cpp 混淆

confused by YAML::NodeType::Undefined with yaml-cpp

我有一个测试 yaml 文件,我正在尝试使用 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() returns YAML::NodeType::Map。这是预期的行为。

然后,我尝试解析包含以获取我无法迭代的必需值或可选值,因为 includes.Type() returns 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 }

解决方案: 我删除了不必要的顶层 configTest 以便我可以根据需要解析包含的内容。

好吧,您的顶级 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"];
// ...

您正在查看 configRoot["includes"],但地图中的顶级键是 testConfig。请改用 configRoot["testConfig"]