首页 > 解决方案 > 使用 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_iterators 或YAML::iterators 循环遍历所有这些值时,我收到以下错误提示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;

标签: c++yaml

解决方案


我不完全确定这是否不是错误,但您可以将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"

你必须处理这个案子。


推荐阅读