首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >yaml-cpp InvalidNode异常

yaml-cpp InvalidNode异常
EN

Stack Overflow用户
提问于 2015-01-14 23:35:22
回答 1查看 1.9K关注 0票数 1

我试图使用yaml-cpp来处理以下yaml:

代码语言:javascript
复制
- hosts: localhost
  tasks:
    - shell: whoami
    - shell: hostname

我有一个限制,我不能控制yaml的到来。对我来说这似乎太复杂了,但我必须处理这件事。

看着yaml

显示yaml很好。

我正在使用以下代码来尝试完成任务:

代码语言:javascript
复制
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循环中与其相关的任何内容(第一次或第二次)时,出现异常:

代码语言:javascript
复制
Unhandled exception at 0x7524C41F in ProcYaml.exe: Microsoft C++ exception: YAML::InvalidNode at memory location 0x0040F748.

printNodeInfo(pb)显示:

代码语言:javascript
复制
  Node size: 1
  Node Tag: ?
  Node is of Type: Sequence

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

当我删除抛出的异常代码(如果(it->first) {.})时,计数打印为1

我想我在这方面的主要误解是:如果我不能反复使用pb,我该如何处理呢?我对yaml和yaml-cpp都是新手,所以我确信这里有一个新的因素。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-15 12:01:49

在对序列进行迭代时,迭代器只需取消引用:

代码语言:javascript
复制
for (YAML::const_iterator it = pb.begin(); it != pb.end(); ++it) {
  YAML::Node element = *it;
  // do something with element
}

it->firstit->second模式用于迭代映射:

代码语言:javascript
复制
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的结构)之前,必须检查类型(就像您正在做的那样)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27954458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档