【问题标题】:Parsing yaml file using yaml-cpp new API - Issue Fixed使用 yaml-cpp 新 API 解析 yaml 文件 - 已修复问题
【发布时间】:2018-10-04 05:14:50
【问题描述】:

我正在使用最新的 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

请帮助我理解为什么根节点配置在我的情况下为 Null,尽管它的大小返回 2。 此外,如果配置虽然 Null 是可迭代的,那么为什么不节点呢? 迭代节点会引发段错误,因此被评论。 如何遍历节点以在我的情况下列出人员并读取每个人的属性? 如何获取姓名、年龄.. 使用类似 node["person"]["name"] 的东西?

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

【问题讨论】:

  • 当我升级到 0.6 版时,我似乎遇到了顶级节点为空的相同问题。你有没有回到 0.6 并弄明白?

标签: c++ yaml-cpp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 2018-10-13
    • 2015-12-06
    • 2015-05-14
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多