yaml-cpp InvalidNode 异常
yaml-cpp InvalidNode exception
我正在尝试使用 yaml-cpp 来处理以下 yaml:
- hosts: localhost
tasks:
- shell: whoami
- shell: hostname
我有一个限制,我无法控制传入的 yaml。这对我来说似乎过于复杂,但我必须处理它。
显示 yaml 很好。
我正在使用以下代码尝试完成任务:
YAML::Node pb = YAML::LoadFile(str_pbFilename);
printNodeInfo(pb);
if (pb.Type() == YAML::NodeType::Sequence)
{
int count = 0;
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it)
{
if (it->first)
{
cout << "found first" << endl;
}
count++;
cout << "count = " << count << endl;
}
}
当我试图访问任何它-> 循环迭代内相关的(第一个或第二个)时出现异常:
Unhandled exception at 0x7524C41F in ProcYaml.exe: Microsoft C++ exception: YAML::InvalidNode at memory location 0x0040F748.
printNodeInfo(pb) 显示:
Node size: 1
Node Tag: ?
Node is of Type: Sequence
我不确定我需要做什么来处理第一个序列节点并进入我需要的元素:主机和为每个主机处理的任务。
当我删除异常抛出代码时,计数打印为 1 (if (it->first) {...})
我想我对此的主要误解是:如果我不能迭代它,我怎么用 pb 做任何事情?我是 yaml 和 yaml-cpp 的新手,所以我确信这里有一个菜鸟因素。
迭代序列时,迭代器只需要取消引用:
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it) {
YAML::Node element = *it;
// do something with element
}
it->first
和 it->second
模式用于遍历映射:
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it) {
YAML::Node key = it->first;
YAML::Node value = it->second;
// do something with key, value
}
由于 YAML 节点可以是标量、序列或映射,因此您必须在进行任何类型的迭代之前检查类型(就像您正在做的那样)(除非您确切知道输入 YAML 的结构) .
我正在尝试使用 yaml-cpp 来处理以下 yaml:
- hosts: localhost
tasks:
- shell: whoami
- shell: hostname
我有一个限制,我无法控制传入的 yaml。这对我来说似乎过于复杂,但我必须处理它。
显示 yaml 很好。
我正在使用以下代码尝试完成任务:
YAML::Node pb = YAML::LoadFile(str_pbFilename);
printNodeInfo(pb);
if (pb.Type() == YAML::NodeType::Sequence)
{
int count = 0;
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it)
{
if (it->first)
{
cout << "found first" << endl;
}
count++;
cout << "count = " << count << endl;
}
}
当我试图访问任何它-> 循环迭代内相关的(第一个或第二个)时出现异常:
Unhandled exception at 0x7524C41F in ProcYaml.exe: Microsoft C++ exception: YAML::InvalidNode at memory location 0x0040F748.
printNodeInfo(pb) 显示:
Node size: 1
Node Tag: ?
Node is of Type: Sequence
我不确定我需要做什么来处理第一个序列节点并进入我需要的元素:主机和为每个主机处理的任务。
当我删除异常抛出代码时,计数打印为 1 (if (it->first) {...})
我想我对此的主要误解是:如果我不能迭代它,我怎么用 pb 做任何事情?我是 yaml 和 yaml-cpp 的新手,所以我确信这里有一个菜鸟因素。
迭代序列时,迭代器只需要取消引用:
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it) {
YAML::Node element = *it;
// do something with element
}
it->first
和 it->second
模式用于遍历映射:
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it) {
YAML::Node key = it->first;
YAML::Node value = it->second;
// do something with key, value
}
由于 YAML 节点可以是标量、序列或映射,因此您必须在进行任何类型的迭代之前检查类型(就像您正在做的那样)(除非您确切知道输入 YAML 的结构) .