我正在使用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>();
}