【发布时间】:2022-01-22 07:54:03
【问题描述】:
给定YAML::Node,我们如何访问该节点内的所有标量节点(以修改它们)?我最好的猜测是递归函数:
void parseNode(YAML::Node node) {
if (node.IsMap()) {
for (YAML::iterator it = node.begin(); it != node.end(); ++it) {
parseNode(it->second);
}
}
else if (node.IsSequence()) {
for (YAML::iterator it = node.begin(); it != node.end(); ++it) {
parseNode(*it);
}
}
else if (node.IsScalar()) {
// Perform modifications here.
}
}
这可以满足我的需要,除了在一种情况下:如果有递归锚/别名。 (我认为 YAML 1.2 规范允许这样做?yaml-cpp 在解析时当然不会抛出 Exception)例如:
first: &firstanchor
a: 5
b: *firstanchor
上面的代码将重复跟随锚的别名,直到崩溃(SEGFAULT)可能是由于堆栈问题。如何克服这个问题?
- 有没有更好的方法来遍历整个未知的
Node结构来解决这个问题? - 有没有办法使用公共 API 从
Node检查它是否是别名,这样我们就可以维护一堆以前访问过的别名来检测循环和中断。 - 或者有没有办法获取一些唯一的
Node标识符,这样我就可以维护一堆以前访问过的节点? - 或者最后,这个递归锚点/别名是否不符合规范 - 在这种情况下,我如何检查它的出现以确保我可以返回适当的错误?
【问题讨论】: