首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用yaml-cpp解析YAML文件

使用yaml-cpp解析YAML文件
EN

Stack Overflow用户
提问于 2020-06-24 07:49:16
回答 1查看 2.6K关注 0票数 4

我正在使用yaml -CPP0.3.0(旧的API版本)来解析yaml文件(我是从这里获得的)。

这是yaml文件:

代码语言:javascript
运行
复制
- name: Ogre
  position: [0, 5, 0]
  powers:
    - name: Club
      damage: 10
    - name: Fist
      damage: 8
- name: Dragon
  position: [1, 0, 10]
  powers:
    - name: Fire Breath
      damage: 25
    - name: Claws
      damage: 15
- name: Wizard
  position: [5, -3, 0]
  powers:
    - name: Acid Rain
      damage: 50
    - name: Staff
      damage: 3

现在,我试着用下面的代码解析权力、名称和损害:

代码语言:javascript
运行
复制
#include "yaml-cpp/yaml.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

// our data types
struct Vec3 {
   float x, y, z;
};

struct Power {
   std::string name;
   int damage;
};

struct Monster {
   std::string name;
   Vec3 position;
   std::vector <Power> powers;
};

// now the extraction operators for these types
void operator >> (const YAML::Node& node, Vec3& v) {
   node[0] >> v.x;
   node[1] >> v.y;
   node[2] >> v.z;
}

void operator >> (const YAML::Node& node, Power& power) {
   node["name"] >> power.name;
   node["damage"] >> power.damage;
}

void operator >> (const YAML::Node& node, Monster& monster) {
   node["name"] >> monster.name;
   node["position"] >> monster.position;
   const YAML::Node& powers = node["powers"];
   for(unsigned i=0;i<powers.size();i++) {
      Power power;
      powers[i] >> power;
      monster.powers.push_back(power);
   }
}

int main()
{
   std::ifstream fin("robot.yaml");
   YAML::Parser parser(fin);
   YAML::Node doc;
   parser.GetNextDocument(doc);
   for(unsigned i=0;i<doc.size();i++) {
      Power power;
      doc[i] ["powers"] >> power;
      std::cout << power.name << "\n";
      std::cout << power.damage << "\n";
   }

   return 0;
}

我的代码似乎显示了如下错误:

代码语言:javascript
运行
复制
terminate called after throwing an instance of 'YAML::TypedKeyNotFound<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >'
  what():  yaml-cpp: error at line 4, column 5: key not found: name
Aborted (core dumped)

请帮助我理解为什么我不能解析powers元素。

并且,请向我解释如何解析所有的键值在一个代码中,因为我是新的编码。

EN

回答 1

Stack Overflow用户

发布于 2020-06-24 09:33:22

所以问题是:

代码语言:javascript
运行
复制
  doc[i] ["powers"] >> power;

doc[i]["powers"]没有索引"name":

  • 姓名:食人魔 职位: 0,5,0 权力:
    • 名称:俱乐部 损坏: 10
    • 名称:拳头 损坏:8

"-“表示项目。因此,与doc[i]类似,您需要首先索引:

代码语言:javascript
运行
复制
Power power;
doc[i]["powers"][0] >> power;
std::cout << power.name //outputs "Club"

但是我假设您想要每个项目的所有能力,所以您需要另一个显式的for -循环:

代码语言:javascript
运行
复制
for (unsigned i = 0; i < doc.size(); i++)
{
    for (unsigned j = 0; j < doc[i]["powers"].size(); ++j)
    {
        Power power;
        doc[i]["powers"][j] >> power;
        std::cout << power.name << "\n";
        std::cout << power.damage << "\n";
    }
}

但这有点过头了。最好直接使用Monster-class,因为电源值已经存储在那里了:

代码语言:javascript
运行
复制
for(unsigned i=0;i<doc.size();i++) {
    Monster monster;
    doc[i] >> monster;

    for (auto& power : monster.powers) // range-for loop
    {
        std::cout << power.name << "\n";
        std::cout << power.damage << "\n";
    }
    std::cout << monster.name << "\n";
}

也许这是个好的开始。答案的延续将取决于你想要实现什么。

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

https://stackoverflow.com/questions/62550215

复制
相关文章

相似问题

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