我正在使用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。 如果配置虽然Null是可迭代的,为什么不是节点呢? 迭代节点抛出seg错误并如此评论。 如何迭代节点列出我的案例中的人并阅读每个人的属性? 如何获得名称,年龄..使用节点[“人”] [“名称”]?
这是我身边的错误。不确定,如果是因为libyaml-cpp安装错误...它开始工作一次,删除并重新安装了libyaml-cpp0.5 / libyaml-cpp-dev。 谢谢!
答案 0 :(得分:0)
首先要注意的是: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>();
}