我试图使用yaml-cpp来处理以下yaml:
- hosts: localhost
tasks:
- shell: whoami
- shell: hostname我有一个限制,我不能控制yaml的到来。对我来说这似乎太复杂了,但我必须处理这件事。
看着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;
}
}当我试图访问迭代for循环中与其相关的任何内容(第一次或第二次)时,出现异常:
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我不确定我需要做什么来处理这个第一个序列节点并进入我需要的元素:主机和每个主机要处理的任务。
当我删除抛出的异常代码(如果(it->first) {.})时,计数打印为1
我想我在这方面的主要误解是:如果我不能反复使用pb,我该如何处理呢?我对yaml和yaml-cpp都是新手,所以我确信这里有一个新的因素。
发布于 2015-01-15 12:01:49
在对序列进行迭代时,迭代器只需取消引用:
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的结构)之前,必须检查类型(就像您正在做的那样)。
https://stackoverflow.com/questions/27954458
复制相似问题