使用yaml-cpp new API解析yaml文件 - 问题已修复

时间:2018-04-24 04:08:26

标签: 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

请帮助我理解为什么根节点,在我的情况下配置是空的,虽然它的大小返回2。 如果配置虽然Null是可迭代的,为什么不是节点呢? 迭代节点抛出seg错误并如此评论。 如何迭代节点列出我的案例中的人并阅读每个人的属性? 如何获得名称,年龄..使用节点[“人”] [“名称”]?

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

1 个答案:

答案 0 :(得分:0)

首先要注意的是: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>();
}