[英]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.