解析序列/映射节点时无效的yaml节点错误

时间:2018-04-20 16:32:01

标签: c++ yaml yaml-cpp

我完全了解yaml规范的重复键问题:

  

映射节点的内容是一组无序的键:值节点对,并且每个键都是唯一的限制。

例如,我使用带有嵌套树结构的yaml-cpp库发出了一个yaml文件,如下所示:

work:
  - run:
      type: workout
      figures:
        start_time:
           start: 9
        end_time:
           end: 12
  - run:
     type: workout
     figures:
        start_time:
           start: 16
        end_time:
           end: 18

显然,它有重复的密钥,yaml-validator将其视为普通文件。但是当我尝试使用yaml-cpp解析它时

void parser(const std::string& path)
{
    const YAML::Node& baseNode = YAML::Loadfile(path);

    for (const auto& item : baseNode["work"]);
    {
        switch (item.second.Type()) //Error not a valid yaml node
        {
            //If it is a NullNode
            case YAML::NodeType::Null:
            break;

            //If it is a ScalarNode
            case YAML::NodeType::Scalar:

                scalarNodeIterator(item.second, item.first.as<std::string>());
                break;

            //If it is a SequenceNode
            case YAML::NodeType::Sequence:

                sequenceNodeIterator(item.second, item.first.as<std::string>());
                break;

            //If it is a MapNode
            case YAML::NodeType::Map:

                mapNodeIterator(item.second, item.first.as<std::string>());
                break;
        }
    }
}

我想要什么:

正如您所看到的,我有自己的节点相关迭代器来读取任何类型的yaml树。我需要使用重复键,当我这样做时,解析器应该按预期工作。

是否可以实现一个可以读取run之类节点的解析器?如果是的话,我该如何实现呢?如果没有,任何其他解决方案发出具有可读重复键的yaml文件?

1 个答案:

答案 0 :(得分:0)

您的示例没有重复的密钥,正如@tinita在评论中指出的那样。

相反,在“工作”键下,您有一个地图列表,每个地图都有“运行”键,值为地图。

这就是你收到错误的原因。当你迭代

for (const auto& item : baseNode["work"])

item将表示一个节点(因为您正在迭代序列),而不是键/值对。您然后必须遍历其(一个)元素才能读取键/值对。