我正在使用最新的 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
请帮助我理解为什么根节点 config 在我的例子中为 Null,尽管它的大小返回 2。 另外,如果配置虽然 Null 是可迭代的,那为什么不节点呢? 遍历节点会抛出段错误并进行评论。 如何遍历节点以列出我案例中的人员并读取每个人的属性? 如何使用 node["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 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>();
}
关于c++ - 使用 yaml-cpp 新 API 解析 yaml 文件 - 问题已修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49993271/