解析 sequence/map 节点时出现无效的 yaml 节点错误
Invalid yaml node error while parsing sequence/map node
我完全了解 yaml 规范的重复键问题:
The content of a mapping node is an unordered set of key: value node pairs, with the restriction that each of the keys is unique.
例如,我使用带有嵌套树结构的 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 文件吗?
正如@tinita 在评论中指出的那样,您的示例没有重复键。
相反,在 "work" 键下,您有一个地图列表,每个地图都有键 "run" 和值 a map。
这就是您收到错误的原因。当你迭代
for (const auto& item : baseNode["work"])
item
将代表一个节点(因为您正在遍历一个序列),而不是 key/value 对。您 then 必须遍历其(一个)元素才能读取 key/value 对。
我完全了解 yaml 规范的重复键问题:
The content of a mapping node is an unordered set of key: value node pairs, with the restriction that each of the keys is unique.
例如,我使用带有嵌套树结构的 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 文件吗?
正如@tinita 在评论中指出的那样,您的示例没有重复键。
相反,在 "work" 键下,您有一个地图列表,每个地图都有键 "run" 和值 a map。
这就是您收到错误的原因。当你迭代
for (const auto& item : baseNode["work"])
item
将代表一个节点(因为您正在遍历一个序列),而不是 key/value 对。您 then 必须遍历其(一个)元素才能读取 key/value 对。