我正在尝试使用嵌套映射和序列来解析文件,这些映射和序列看起来像这样
annotations:
- dodge:
type: range based
attributes:
start_frame:
frame_number: 25
time_stamp: 2017-10-14 21:59:43
endframe:
frame_number: 39
time_stamp: 2017-10-14 21:59:45
distances:
- 2
- 5
- 6
我收到错误提示确保节点存在。以下是我的示例代码。
YAML::Node basenode = YAML::LoadFile(filePath);
const YAML::Node& annotations = basenode["annotations"];
RangeBasedType rm;
for (YAML::const_iterator it = annotations.begin(); it != annotations.end(); ++it)
{
const YAML::Node& gestures = *it;
std::string type = gestures["type"].as<std::string>(); // this works
rm.setGestureName(type);
if (type == "range based")
{
const YAML::Node& attributes = gestures["attributes"];
for (YAML::const_iterator ti = attributes.begin(); ti != attributes.end(); ++ti)
{
const YAML::Node& frame = *ti;
if (frame["start_frame"]) // this fails saying it is not a valid node
{
std::cout << frame["frame_number"].as<int>();
rm.setStartFrame(frame["frame_number"].as<int>());
}
}
}
}
我希望从节点start_frame和end_frame获取frame_number。我检查了YAML格式的有效性。为什么这不起作用的任何原因?
答案 0 :(得分:1)
这个循环:
for (YAML::const_iterator ti = attributes.begin(); ti != attributes.end(); ++ti)
正在遍历地图节点。因此,迭代器指向键/值对。你的下一行:
const YAML::Node& frame = *ti;
将其解除引用为节点。相反,您需要查看其键/值节点:
const YAML::Node& key = ti->first;
const YAML::Node& value = ti->second;
yaml-cpp
允许迭代器指向节点和键/值对,因为它可以是映射或序列(或标量),并且它实现为单个C ++类型。