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

Posted

技术标签:

【中文标题】解析序列/映射节点时出现无效的 yaml 节点错误【英文标题】:Invalid yaml node error while parsing sequence/map node 【发布时间】:2018-04-20 16:32:00 【问题描述】:

我完全了解 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】:

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

相反,在“work”键下,您有一个映射列表,每个映射都有一个键“run”和一个映射值。

这就是您收到错误的原因。迭代时

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

item 将代表一个节点(因为您正在遍历一个序列),而不是一个键/值对。您然后将不得不遍历它的(一个)元素来读取键/值对。

【讨论】:

以上是关于解析序列/映射节点时出现无效的 yaml 节点错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试从节点脚本部署以太坊智能合约时出现“无效发件人”(-32000)?

YAML流程

YAML语法字符

映射 hbm 文件时出现错误“命名空间中的元素 'class' 具有无效的子元素 'set'”

尝试在反应中映射数据时出现错误。对象作为 React 子对象无效(找到:带有键 children 的对象),我该如何解决?

如何在 C 中修改现有的 YAML 节点?