c++ - 使用 cpp 解析 YAML 小节
问题描述
我在 .yaml 中有这个配置:
server:
- address: "0:0"
- address: "0:0"
virtual-hosts:
- address: "0:0"
- http:
root: "/www/index.html"
server-name: "lambda"
- address:
protocol: http-1.0
modules:
- ssl-2.7
- cgi-php-1.0
我正在尝试从每个键(从每个节点)中提取每个值,但是当我开始使用YAML::const_iterator
s 或YAML::iterator
s 循环遍历所有这些值时,我收到以下错误提示invalid node; this may result from using a map iterator as a sequence iterator, or vice-versa
:我尝试检查映射迭代器和序列迭代器之间的区别,但我什至无法找到有用的文档。
这是我在阅读 YAML CPP 参考并在此处查找解决方案后尝试的一些代码:
YAML::Node config = YAML::LoadFile(path);
YAML::Node vhosts_n = config["virtual-hosts"];
...
for(YAML::iterator param = vhosts_n.begin(); param != vhosts_n.end(); ++param) {
std::string tmp = param->first.as<std::string>();
std::cout << tmp << std::endl;
}
for(YAML::iterator param = vhosts_n.begin(); param != vhosts_n.end(); ++param) {
std::string tmp = *param;
std::cout << tmp->first.as<std::string>() << std::endl;
}
for(YAML::const_iterator param = vhosts_n.begin(); param != vhosts_n.end(); ++param)
std::cout << param->first.as<std::string>() << std::endl;
解决方案
我不完全确定这是否不是错误,但您可以将param->begin()
其用作循环中的一个步骤。一个例子 :
#include "yaml-cpp/yaml.h"
#include <iostream>
#include <string>
int main()
{
YAML::Node config = YAML::LoadFile("YOUR PATH");
YAML::Node vhosts_n = config["virtual-hosts"];
for(YAML::const_iterator param = vhosts_n.begin(); param != vhosts_n.end(); ++param)
{
switch (param->Type()) {
case YAML::NodeType::Null:
std::cout << "null" << std::endl;
break;
case YAML::NodeType::Scalar:
std::cout << "scalar" << std::endl;
break;
case YAML::NodeType::Sequence:
std::cout << "seq" << std::endl;
break;
case YAML::NodeType::Map:
{
std::cout << "map" << std::endl;
auto n = param->begin();
std::string map_first = n->first.as<std::string>();
std::string map_second = n->second.as<std::string>();
std::cout << map_first << " " << map_second << std::endl;
break;
}
case YAML::NodeType::Undefined:
std::cout << "undef" << std::endl;
}
}
}
请注意,代码会因为以下原因而崩溃:
- http:
root: "/www/index.html"
server-name: "lambda"
你必须处理这个案子。
推荐阅读
- java - 如何将对象数组转换为任意内容类型 T (Object[] -> T[])
- c# - How to get migration of Database in c# project
- java - Firebase Messaging Notifications not coming through even though database correctly referenced
- angular - How to get the id of the element who calls a function in the ngif directive?
- coldfusion - cfscript and queryExecute() using like instead of equals
- c# - Unity, setWindowsHook and multi-thread for frame independent input system on Windows
- authentication - Use Google as the OIDC provider without leaking client secret in kubernetes
- json - searchbar filter ionic v3 with json
- python-3.x - 如何在 Jupyter Notebook 之外查看 Bokeh/Holoview 图?
- android - java.lang.ClassCastException:edgar.yodgorbek.sportnews.component.DaggerApplicationComponent?