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