c++ - Yaml-cpp(新 API)——嵌套映射/序列组合和迭代

标签 c++ yaml-cpp

我在这个 api 处理 map 与序列的过程中遇到了一些非常基本的问题。假设我有以下结构:

foo_map["f1"] = "one";
foo_map["f2"] = "two";
bar_map["b1"] = "one";
bar_map["b2"] = "two";

我希望将其转换为以下 YAML 文件:

Node: 
    - Foo:
      f1 : one
      f2 : two
    - Bar:
      b1 : one
      b2 : two

我会这样做:

node.push_back("Foo");
node["Foo"]["b1"] = "one";
...
node.push_back("Bar");

但是在最后一行节点现在已经从一个序列转换为一个映射并且我得到一个异常。我能做到这一点的唯一方法是输出 map 的 map :

Node:
    Foo:
      f1 : one
      f2 : two
    Bar:
      b1 : one
      b2 : two

问题是如果我无法读回此类文件。如果我遍历 Node,我什至无法在没有异常的情况下获取节点迭代器的类型。

YAML::Node::const_iterator n_it = node.begin();

for (; n_it != config.end(); n_it++) {
        if (n_it->Type() == YAML::NodeType::Scalar) {
            // throws exception
        }
    }

这应该很容易处理,但一直让我发疯!

最佳答案

YAML 文件

Node: 
    - Foo:
      f1 : one
      f2 : two
    - Bar:
      b1 : one
      b2 : two

可能不是您所期望的。它是一张 map ,只有一个键/值对;键是Node,值是一个序列;该序列的每个条目都是一个具有三个键/值对 的映射,并且与例如Foo 关联的值是null。最后一部分可能不是您所期望的。我猜你想要更像你实际得到的东西,即:

Node:
    Foo:
      f1 : one
      f2 : two
    Bar:
      b1 : one
      b2 : two

现在的问题是如何解析这个结构。

YAML::Node root = /* ... */;
YAML::Node node = root["Node"];

// We now have a map node, so let's iterate through:
for (auto it = node.begin(); it != node.end(); ++it) {
  YAML::Node key = it->first;
  YAML::Node value = it->second;
  if (key.Type() == YAML::NodeType::Scalar) {
    // This should be true; do something here with the scalar key.
  }
  if (value.Type() == YAML::NodeType::Map) {
    // This should be true; do something here with the map.
  }
}

关于c++ - Yaml-cpp(新 API)——嵌套映射/序列组合和迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22504708/

相关文章:

c++ - 取消对用户输入 C++ 的调用

c++ - extern "C"用法(标记的放置)

c++ - QRegExpValidator 参数

c++ - "Illegal block entry"以及 yaml-cpp 中的 YAML 怪物示例

c# - 如何将字符串参数从 C++ com 传递给 C#?

c++ - 如何使用 Boost.Asio C++?

yaml - yaml-cpp 发出的结果字符串 (!<!>) 是什么?

yaml-cpp - 如何获取节点的名称?

yaml-cpp - 如何使用 yaml-cpp 发出和解析原始二进制数据