yaml-cpp解析嵌套映射和序列错误

时间:2018-02-01 17:17:13

标签: c++ yaml-cpp

我正在尝试使用嵌套映射和序列来解析文件,这些映射和序列看起来像这样

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格式的有效性。为什么这不起作用的任何原因?

1 个答案:

答案 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 ++类型。