用C ++解析YAML词典列表

时间:2016-12-08 11:40:03

标签: c++ c++11 for-loop yaml-cpp

我有以下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范围进行循环解析?感谢

1 个答案:

答案 0 :(得分:2)

如果您正在迭代YAML序列,您获得的条目是序列中的条目,不是键/值对:

$Input_file= Get-Content D:\Serverlist.txt # Getting list of servers from the text file

foreach($Input in $Input_file) # Iterating each server
{
  $OS_Architecture=(Get-WmiObject Win32_OperatingSystem -ComputerName $Input ).OSArchitecture # Getting the OS Architecture for each server
  if($OS_Architecture -eq '64-bit')
    {
    # write the code for 64 bit OS Architecture
    <#
    $objswbem = New-Object -ComObject "WbemScripting.SWbemNamedValueSet"            
    $objswbem.Add("__ProviderArchitecture", $Arch) | Out-null            
    $objswbem.Add("__RequiredArchitecture", $True) | Out-null            
    $ObjLocator = New-Object -ComObject "Wbemscripting.SWbemLocator"            
    $objServices = $objLocator.ConnectServer($Computer,"root\Default",$null,$null,$null,$null,$null,$objswbem)            
    $objReg = $objServices.Get("stdRegProv")
    #>
    }
   else 
   {
   # Write the code for 32 Bit OS Architecture
   }

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>(); // .... } } 包含字段pfirst的原因是yaml-cpp中的迭代过载:您可以遍历序列(条目是节点)或映射(其中条目是键/值对)。在每种情况下,对方的语法都是静态可用的,但在运行时不会给你任何合理的信息。