2016-12-08 124 views
2

我有以下YAML(我的情况的简化版本):解析C++中词典的YAML列表

--- 
my_list: 
    - item1: 
     name: name1 
    - item2: 
     name: name2 

然后我试图解析它这样使用C++和YAML-CPP:

for (const auto & p : node["my_list"]) { 
    std::cout << p.IsMap() << std::endl; 
    YAML::Node key = p.first; 
    YAML::Node value = p.second; 
} 

这显然作品(IsMap() 1的回报),但只要我做的:p.first.as<std::string>();崩溃。我应该如何解析这个?

相反,如果我这样做:

for (auto it = node.begin(); it != node.end(); ++it) { 
    YAML::Node key = it->first; 
    YAML::Node value = it->second; 
    std::cout << key.as<std::string>() << std::endl; 
} 

和输出这里是my_list,这样我就可以继续进行解析。

我的问题是:如何解析使用C++11范围for循环?由于

+0

你确定p是一对,而不是有第一个和第二个可转换为YAML :: Nodes的东西吗? – Caleth

+0

不,我不确定。我不清楚YAML-CPP库。我试过其他的东西,比如'p.as ()'。如果我做字典词典很容易解析,但由于某种原因,列表不是。 –

+0

我终于找到答案了,尽管我不知道为什么!看来'for(const auto&p:node [“my_list”])'返回列表本身,所以你可以做'p [0],p [1] ...'。字典是列表的一个元素,所以每个字典都需要另一个for循环:'for(const auto&elem:p)'。如果没有人提供更好的答案和更好的解释,我会写这个答案。 –

回答

2

如果你通过YAML序列迭代,你得到的条目是序列中的条目,键/值对:

for (const auto& p : node["my_list"]) { 
    std::cout << p.IsMap() << "\n"; 
    // Here 'p' is a map node, not a pair. 
    for (const auto& key_value : p) { 
     // Now 'key_value' is a key/value pair, so you can read it: 
     YAML::Node key = key_value.first; 
     YAML::Node value = key_value.second; 
     std::string s = key.as<std::string>(); 
     // .... 
    } 
} 

p有场firstsecond原因yaml-cpp中的迭代过载:您可以遍历序列(其中条目是节点)或映射(其中条目是键/值对)。在每种情况下,其他语法都是静态可用的,但在运行时不会给你任何合理的信息。

+0

非常感谢!然而,我不明白为什么如果'p'是一个映射节点,序列的元素,为什么我不能'p [0] .first.as ()'? –

+0

如果'p'是一个映射节点,那么'p [0]'指的是与关键字'0'相关的值,这不是你所指的。你的问题是什么? –

+0

我想我现在明白了,非常感谢! –