使用YAML -CPP新API - 已修复的YAML文件解决

Parsing yaml file using yaml-cpp new API - Issue Fixed

本文关键字:YAML 解决 文件 -CPP API 使用      更新时间:2023-10-16

我正在使用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。另外,如果config虽然null是算是的,那么为什么不节点呢?迭代节点抛出seg故障,因此发表了评论。如何迭代节点以列出我的情况并阅读每个人的属性?如何获得名称,年龄..使用节点[" 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教程中:

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

我尚未测试以下测试,但它可能在您的循环中起作用:

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>();
}