首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cpp对YAML分节进行分析

使用cpp对YAML分节进行分析
EN

Stack Overflow用户
提问于 2021-02-25 21:35:16
回答 1查看 66关注 0票数 0

我在.yaml中有这样的配置:

代码语言:javascript
复制
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_iteratorYAML::iterator遍历所有这些键时,系统提示我出现以下错误:invalid node; this may result from using a map iterator as a sequence iterator, or vice-versa。我试图检查map迭代器和序列迭代器之间的区别,但我甚至找不到有用的文档。

以下是我在阅读YAML CPP参考资料并在此处查找解决方案后尝试的一些代码:

代码语言:javascript
复制
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;
}
代码语言:javascript
复制
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;
}
代码语言:javascript
复制
for(YAML::const_iterator param = vhosts_n.begin(); param != vhosts_n.end(); ++param)
    std::cout << param->first.as<std::string>() << std::endl;
EN

回答 1

Stack Overflow用户

发布于 2021-02-25 23:02:14

我不能完全确定这是否是一个bug,但是你可以使用param->begin()作为你循环中的一个步骤。举个例子:

代码语言:javascript
复制
#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;
      }
    }
}

请注意,代码会因为以下原因而崩溃:

代码语言:javascript
复制
    - http:
        root: "/www/index.html"
        server-name: "lambda"

你必须处理好这个案子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66369588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档