【问题标题】:Yaml-cpp (new API) - nested map / sequence combinations and iterationYaml-cpp (new API) - 嵌套映射/序列组合和迭代
【发布时间】:2014-03-19 11:41:12
【问题描述】:

我在这个 api 处理地图与序列方面遇到了相当基本的问题。假设我有以下结构:

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");

但是,在最后一行节点现在已从序列转换为地图,我得到了一个异常。我能做到这一点的唯一方法是输出一张地图:

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
        }
    }

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

【问题讨论】:

标签: c++ yaml-cpp


【解决方案1】:

YAML 文件

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

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

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.
  }
}

【讨论】:

  • “这是一个映射,只有一个键/值对” - no, it's not。您和 op 可能会想到一些 like this,以保持他的对象的顺序。
  • 谢谢,从现在开始我会更好地使用在线 YAML 解析器,这样我就可以看到发生了什么
猜你喜欢
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多