c++ - 使用 yaml-cpp 新 API 解析 yaml 文件 - 问题已修复

标签 c++ yaml-cpp

我正在使用最新的 yaml-cpp 0.6 来解析 yaml 文件。

我的 yaml 文件是这样的,

-person: p1
 obj: 
   name: x
   age: 27
-person: p2
 obj:
   name: y
   age:38

我的代码,

#include <iostream>
#include <yaml-cpp/yaml.h>
using namespace std;
int main()
{
    YAML::Node config = YAML::LoadFile("config.yaml");
    if(config.IsNull())
    {
        cout << "return";
    }

    cout << "size: " << config.size() << endl;
    for(YAML::iterator it = config.begin(); it != config.end(); ++it)
    {
        YAML::Node node = *it;
        cout << "node size: " << node.size() << endl;
        //for(YAML::iterator it2 = node.begin(); it2!=node.end(); ++it2) {}
        //iterating over node throws seg fault
        cout << node << endl;
        cout << "-----" << endl;
    }
    return 0;
}

我看到的o/p是,

return
size: 2
node size: 2
node size: 2

obj:
  name: x
  age: 27
person: p1
2
-----
person: p2
obj:
  age: 38
  name: y

请帮助我理解为什么根节点 config 在我的例子中为 Null,尽管它的大小返回 2。 另外,如果配置虽然 Null 是可迭代的,那为什么不节点呢? 遍历节点会抛出段错误并进行评论。 如何遍历节点以列出我案例中的人员并读取每个人的属性? 如何使用 node["person"]["name"] 之类的方法获取姓名、年龄……?

这是我的错误。不确定,如果是因为 libyaml-cpp 安装错误......它开始工作一次,删除并重新安装 libyaml-cpp0.5/libyaml-cpp-dev。 谢谢!

最佳答案

这里首先要注意的是:Yaml 对格式非常敏感,例如。空间。您能否先尝试使用一些在线 yaml 解析器来解析您的 Yaml。

我刚刚使用 yaml-online-parser 进行了尝试,请参阅以下文档(例如两个空格缩进,键/值之间始终有一个空格)

- person: p1
  obj: 
    name: x
    age: 27

- person: p2
  obj:
    name: y
    age: 38

您提供了两个 person 对象的列表,我猜这就是为什么您的根节点 config.IsNull() 返回 true 的原因。

您能否尝试检查对象类型,例如。就像在 yaml-cpp tutorial :

switch (node.Type()) {
  case Null: // ...
  case Scalar: // ...
  case Sequence: // ...
  case Map: // ...
  case Undefined: // ...
}

我还没有测试以下内容,但它可能在您的 for 循环中有效:

string name(""), age("");
if (node["obj"] == NULL) continue;

if (node["obj"]["name"]) {
     name = node["obj"]["name"].as<std::string>();
}

if (node["obj"]["age"]) {
    age = node["obj"]["age"].as<std::string>();
}

关于c++ - 使用 yaml-cpp 新 API 解析 yaml 文件 - 问题已修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49993271/

相关文章:

c++ - 使用 YAML::Emitter 将嵌套映射和序列写入 yaml 文件

c++ - 使用 pybind11 包装 yaml-cpp 迭代器

c++ - 如何在编译时将整数模板参数修改为非零?

C++ 文件输入循环有困难吗?

c++ - 调用 QGLWidget::setFormat = 无绘图

c++ - 如何在我的 CMakelists.txt 中链接 yaml-cpp?

c++ - 如何解码列表列表?

c++ - 无法使用Qt Creator在Windows中构建yaml-cpp

java - 仅通过命令行创建 native android apk (makefile)

c# - Android/Java 对应 C#/C++ 方法 GetTickCount() 的方法是什么?