被 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"]
。
我有一个测试 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"]
。