2016-12-08 43 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

我想我現在明白了,非常感謝! –