yaml-cpp InvalidNode exception

yaml-cpp InvalidNode exception

本文关键字:exception InvalidNode yaml-cpp      更新时间:2023-10-16

我正在尝试使用 yaml-cpp 来处理以下 yaml:

- hosts: localhost
  tasks:
    - shell: whoami
    - shell: hostname

有一个约束,我不能控制进来的yaml。这对我来说似乎过于复杂,但我必须处理它。

看着 http://yaml-online-parser.appspot.com/?yaml=-+hosts%3A+localhost%0A++tasks%3A%0A++++-+shell%3A+whoami%0A++++-+shell%3A+hostname&type=canonical_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

我不确定我需要做什么来处理第一个 Sequence 节点并进入我需要的元素:主机和每个主机要处理的任务。

当我删除异常抛出代码时,计数打印为 1(如果(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->firstit->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 的结构)。