yaml-cpp InvalidNode exception
yaml-cpp InvalidNode exception
我正在尝试使用 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->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 的结构)。
相关文章:
- 为重写std::exception的库生成swig接口时出错
- 什么是 std::exception::what() 以及为什么要使用它?
- 链表"exception thrown"
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- C++ broken_promise exception
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- QVTKWidget SetRenderWindow() with PCLVisualizer Exception
- 自定义派生的 std::exception 类的 'what' 函数返回神秘的废话
- 使用flag、return、exception、goto或break中止过程
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 派生自 std::exception 的类的赋值运算符
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- std::exception :使用虚函数和继承与变量
- MFC ODBC SQLConfigDataSource() Unhandled Exception
- 这段 C++ 代码的奇怪行为(std::wcout 和 std::exception)
- VTK 7.1.1: vtkX3DExporter exception
- 无法在"catch(const std::exception &ex)"中捕获 std::invalid_argument
- opencv cv::addText exception if no window
- Ctypes: OSError: exception: stack overflow
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用