YAML基本语法及在c++中的应用

1 YAML特点

YAML(YAML Ain’t Markup Language)是一个可读性高,用来表达数据序列化的格式。

  • YAML在视觉上更容易看,避开了各种封闭符号(引号,各种括号)
  • 在YAML文件中嵌入其他序列化格式(json或xml)更为强大,json的语法结构和YAML的内置格式相同
  • YAML能够使用“锚点”引用YAML文件中的其他项目。

从长远来看,YAML是一种更强大和可行的数据序列化格式

2 适用场景

  • 脚本语言:由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用
  • 序列化:因为它是宿主语言数据类型直转的
  • 配置文件:

3 基础语法

3.1 基本规则

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 禁止使用tab缩进,只能使用空格键
  4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
  5. 使用#表示注释
  6. 字符串可以不用引号标注

3.2 三种数据结构

3.2.1 map,散列表

使用冒号(:)表示键值对,

# YAML 表示
 log_level: 0
 cpu_flag: 0


# 对应的Json表示
{
"log_level": 0,
"cpu_flag": 0,
}

也可以写在一行:

# YAML 表示
 {log_level: 0,cpu_flag: 0}

# 对应的Json表示
{
"log_level": 0,"cpu_flag": 0,
}

3.2.2 list 数组

使用连字符(-)表示:

# YAML表示
-
 parser 
-
 analyser
-
 kpu_exe
-
 hardware

# 也可以写在一行
[parser,analyser,kpu_exe,hardware]

# 对应Json表示
[
 "parser",
 "analyser",
 "kpu_exe",
 "hardware"
]

# 也可以写在一行
["parser","analyser","kpu_exe","hardware"]

3.2.3 纯量

最基本的、不可再分的值

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

3.3 数据结构嵌套

3.3.1 map嵌套map

# YAML表示
server_conf:
 socket_conf:
  source_ip: 0.0.0.0
  source_port: 8181
  max_link: 65536
  thread_num: 2

# Json 表示
{ 
"socket_conf": {
  "source_ip": "0.0.0.0",
  "source_port": 8181,
  "max_link": 65536,
  "thread_num": 2
  }
}

3.3.2 map嵌套list

# YAML表示
 module:
 -
  parser 
 -
  analyser
 -
  kpu_exe
 -
  hardware

# 对应Json表示
{"module": ["parser","analyser","kpu_exe","hardware"]}

3.3.3 list嵌套list

# YAML表示
-
  - Ruby
  - Perl
  - Python 
- 
  - c
  - c++
  - java

# 对应Json表示
[ [ 'Ruby', 'Perl', 'Python' ], [ 'c', 'c++', 'java' ] ]

3.3.4 list嵌套map

# YAML表示
data_source: 
 -
  uid: sa
  pwd: 2018Ystech
  data_source_name: doe_unit_test
  use_tables_flag: 0
  table_names:[]
 -
  uid: sa
  pwd: 2018Ystech
  data_source_name: doe_test2
  use_tables_flag: 0
  table_names:[]

3.4 使用锚点

user:
    host: 127.0.0.1
    db: 8

book:
    host: 127.0.0.1
    db: 9

comment:
    host: 127.0.0.1
    db: 10

通过使用锚点和引用的功能

localhost: &localhost1
    host: 127.0.0.1
user:
    <<: *localhost1
    db: 8

book:
    <<: *localhost1
    db: 9

comment:
    <<: *localhost1
    db: 10

其中&表示将localhost1作为localhost的别名,* 标识取别名localhost1对应的value,<<表示将*localhost1代表的map
合并入当前map数据。

4 C++中使用yaml-cpp读写yaml配置文件

4.1 使用方法

  1. yaml-cpp是一个开源库,github上可下载,yaml-cpp。通过CMake来进行构建和编译。
  2. 将头文件和生成的lib库引入到项目中。

4.2 示例

对于如下一个yaml文件config.yml:

server_conf:
 log_path_conf_windows: C:/Log/
 log_path_conf_linux: /home/Log/
 log_level: 0
 backup_kpu_num: 0

c++示例代码

#include <iostream>
#include "include/yaml-cpp/yaml.h"
using namespace std;

int main()
{
	YAML::Node config = YAML::LoadFile("../config.yml");	
	cout << "windows_log_path: " << config["server_conf"]["log_path_conf_windows"].as<string>() << endl;
	cout << "linux_log_path: " << config["server_conf"]["log_path_conf_linux"].as<string>() << endl;
	cout << "log_level: " << config["server_conf"]["log_level"].as<int>() << endl;
	cout << "backup_kpu_num: " << config["server_conf"]["backup_kpu_num"].as<int>() << endl;
	
	return 0;
}

运行结果
在这里插入图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值