You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用yaml-cpp 0.6新版本API解析YAML文件:问题已解决

使用yaml-cpp 0.6解析序列型YAML文件(已解决)

我最近在用yaml-cpp 0.6版本解析一份序列结构的YAML文件,折腾了一阵终于顺利解决了,把细节整理出来给大家参考:

待解析的YAML文件

首先是我的config.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文件
    YAML::Node config = YAML::LoadFile("config.yaml");
    
    // 检查文件是否加载成功
    if(config.IsNull()) {
        cout << "Error: Failed to load config.yaml!" << endl;
        return 1;
    }

    // 输出序列的元素数量,这里会返回2
    cout << "Total items: " << config.size() << endl;

    // 遍历序列中的每个对象节点
    for(YAML::iterator it = config.begin(); it != config.end(); ++it) {
        YAML::Node itemNode = *it;
        
        // 读取person字段并转换为string类型
        string personId = itemNode["person"].as<string>();
        // 读取obj子节点下的name和age
        string userName = itemNode["obj"]["name"].as<string>();
        int userAge = itemNode["obj"]["age"].as<int>();

        // 打印解析结果
        cout << "Person: " << personId 
             << ", Name: " << userName 
             << ", Age: " << userAge << endl;
    }

    return 0;
}

关键解析要点

  • 这份YAML的根节点是序列类型(开头的-表示数组元素),所以config.size()会返回序列的元素个数(这里是2)
  • yaml-cpp 0.6中遍历序列可以用迭代器,每个迭代器指向序列中的单个对象节点
  • 读取节点值时,必须用.as<T>()方法将YAML节点转换为对应的C++类型(比如string、int)
  • 一定要保证YAML文件的缩进正确,否则会导致节点解析为空或者加载失败

内容的提问来源于stack exchange,提问作者user2731714

火山引擎 最新活动