使用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




