簡體   English   中英

Yaml-cpp(新API)-嵌套圖/序列組合和迭代

[英]Yaml-cpp (new API) - nested map / sequence combinations and iteration

我在使用此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
        }
    }

這應該很簡單,但是一直讓我發瘋!

YAML文件

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

可能不是您所期望的。 它是一個映射,具有單個鍵/值對; 關鍵是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.
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM