配置文件 yaml

文章目录

  • 一、yaml简介
  • 二、YAML 文件基本语法
    • 1.缩进
    • 2.键值对
    • 3.注释
    • 4.支持多种数据类型
    • 5.示例 YML 文件
  • 三、YAML 文件的基本元素:纯量、对象、数组
    • 1.纯量(scalars)
      • (1)布尔值(Booleans)
      • (2)Null 值
    • 2.对象(Object) / 映射(Mapping) / 字典(Dictionaries) / 键值对(Key-Value Pairs)
    • 3.数组(Array) / 列表(Lists) / 序列(sequence)
    • 4.复合结构 / 嵌套结构(Nested Structures)
    • 5.多行字符串(Multi-line Strings)
      • (1)字面量式 |
      • (2)折叠式 >
  • 四、实战操作
    • 1.安装YAML
    • 2.编译
    • 3.示例代码
      • (1)代码1
      • (2)代码2:列表、try、catch
      • (3)代码3:嵌套列表
      • (4)代码4:列表中的字典
      • (5)代码5:多行字符串和列表
      • (6)代码6:列表中的混合数据类型
      • (7)代码7:列表中的复合数据
  • 五、YAML的优缺点
  • 六、YAML与其他格式的对比

一、yaml简介

YAML(YAML Ain’t Markup Language)是一种标记语言,用于表示数据结构。它最初的目标是成为一种简洁易读的数据序列化格式,适用于配置文件、数据交换以及日志等应用。YAML 格式的最大特点是其语法非常简洁、直观,尤其适合用于人类阅读和编辑。YAML 支持复杂的数据结构,如字典、列表、嵌套、引用等,因此非常适合用于描述结构化数据。

YAML(“YAML Ain’t Markup Language”)是一种以数据序列化为主的轻量级标记语言,因其语法简洁、易读性高而广泛用于配置文件、数据交换和存储。

YAML 文件使用 .yml.yaml 扩展名

YAML 拥有 Perl、C、XML、HTML 和其他编程语言的特性。YAML 也是 JSON 的超集,所以 JSON 文件在 YAML 中有效。
相比 JSON,因为 YAML 有更好的可读性,对用户更友好,所以通常建议用 YAML 来编写配置文件,尽管它们在大多数情况下可以互换使用。



二、YAML 文件基本语法

YAML 文件通常具有以下几个特点:

1.缩进

YAML 使用空格进行缩进,表示层级关系,推荐使用两个空格作为缩进单位(但是切勿使用制表符 (Tab),否则可能导致解析错误)。

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用 Tab 键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
  • # 表示注释
  • :号后面要加空格

2.键值对

YAML 中的每个数据项都是一个键值对,键和值之间用冒号:分隔,冒号后跟一个空格


3.注释

注释用#符号表示,注释内容从 # 后开始,到行尾结束。【而json文件就不支持注释】


4.支持多种数据类型

YAML 支持字符串、整数、浮动点数、布尔值、Null、日期等类型


5.示例 YML 文件

# 这是一个简单的YML示例
server:host: localhost  # 服务器地址port: 8080       # 端口号database:name: mydbuser: adminpassword: secret123tables:- users- orders- productsenabled: true



三、YAML 文件的基本元素:纯量、对象、数组

YAML 的基本数据结构只有三种:纯量(Scalar)、映射(Mapping) 和 序列(Sequence),分别对应单个值、有序列表和键值对集合:
①纯量:最基本的,不可再分的值;
②对象:mapping/hash/dictionary:键值对的集合;
③数组:sequence/list:一组按次序排列的值;数组和对象可以构成复合结构;


1.纯量(scalars)

纯量是最基本的、不可再分的值。

以下数据类型都属于 JavaScript 的纯量:

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • null:用 ~ 表示
  • 时间
  • 日期
boolean: - TRUE  #true,True都可以- FALSE  #false,False都可以
float:- 3.14- 6.8523015e+5  #可以使用科学计数法
int:- 123- 0b1010_0111_0100_1010_1110    #二进制表示
null:nodeName: 'node'parent: ~  #使用~表示null
string:- 哈哈- 'Hello world'  #可以使用双引号或者单引号包裹特殊字符- newlinenewline2    #字符串可以拆成多行,每一行会被转化成一个空格
date:- 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

(1)布尔值(Booleans)

布尔值可以用 true 或 false 来表示,YAML 还允许使用 yes、no、on、off 等值来表示布尔类型。

is_active: true
is_enabled: yes

(2)Null 值

null 值可以使用 null 或 ~ 来表示。

value1: null
value2: ~

2.对象(Object) / 映射(Mapping) / 字典(Dictionaries) / 键值对(Key-Value Pairs)

YAML 中最基本的元素是键值对,格式为 key: value

(1)键值对:

name: John Doe
age: 30

(2)对象:

key: child-key: valuechild-key2: value2

(3)字典:
字典是由多个键值对组成的集合。在 YAML 中,字典的嵌套通过缩进来表示。

person:name: John Doeage: 30address:street: 123 Main Stcity: New Yorkzip: 10001

3.数组(Array) / 列表(Lists) / 序列(sequence)

YAML 使用 - 符号来表示列表项。每个列表项占据一行,且列表项之间通过换行分隔。

以 - 开头的行表示构成一个数组:

fruits:- Apple- Orange- Banana

4.复合结构 / 嵌套结构(Nested Structures)

YAML 通过缩进表示嵌套结构。可以在字典中嵌套列表,在列表中嵌套字典,或者在字典中嵌套其他字典。

team:- name: Alicerole: Developerskills:- Python- JavaScript- name: Bobrole: Designerskills:- Photoshop- Sketch
languages:- Ruby- Perl- Python 
websites:YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org

5.多行字符串(Multi-line Strings)

YAML 支持多行字符串的表示,有两种方式:字面量式(literal style) 和 折叠式(folded style)。

(1)字面量式 |

字面量式:用 | 表示,将多行文本保留原格式,换行会被保留。

description: |This is a long descriptionthat spans multiple lines,and it will be preserved asmultiple lines in the output.

(2)折叠式 >

折叠式:用 > 表示,将多行文本折叠成一个字符串,换行会被替换为空格。

description: >This is a long descriptionthat spans multiple lines,but it will be collapsed into asingle line.



四、实战操作

1.安装YAML

sudo apt-get install libyaml-cpp-dev

2.编译

编译要加连接选项:-lyaml-cpp,即

g++ read_yaml.cpp -o read_yaml -lyaml-cpp

3.示例代码

(1)代码1

config.yaml

name: MyYAML
version: 0.1
description: "A simple YAML configuration file"
enabled: true

read_yaml.cpp

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>
using std::cout;
using std::endl;
using std::string;int main() {// 读取 YAML 文件YAML::Node config = YAML::LoadFile("config.yaml");// 读取配置项string name        = config["name"].as<string>();          // 获取 'name' 字段double version     = config["version"].as<double>();       // 获取 'version' 字段string description = config["description"].as<string>();   // 获取 'description' 字段bool enabled       = config["enabled"].as<bool>();         // 获取 'enabled' 字段// 输出配置项cout << "Name: "        << name                      << endl;cout << "Version: "     << version                   << endl;cout << "Description: " << description               << endl;cout << "Enabled: "     << std::boolalpha << enabled << endl;return 0;
}

(2)代码2:列表、try、catch

config2.yaml

#基本的列表结构
fruits:- Apple- Banana- Orange

不带try-catch的版本:

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config2.yaml");// 读取 fruits 列表YAML::Node fruits = config["fruits"];if (fruits) {// 遍历 fruits 列表for (const auto& fruit : fruits) {cout << fruit.as<string>() << endl;}} else {cout << "No 'fruits' node found in the YAML file." << endl;}return 0;
}

带 try-catch的版本:

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {try {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config2.yaml");// 读取 fruits 列表YAML::Node fruits = config["fruits"];if (fruits) {// 遍历 fruits 列表for (const auto& fruit : fruits) {cout << fruit.as<string>() << endl;}} else {cout << "No 'fruits' node found in the YAML file." << endl;}} catch (const YAML::Exception& e) {cerr << "Error reading YAML file: " << e.what() << endl;return 1;}return 0;
}

(3)代码3:嵌套列表

#嵌套列表
employees:- name: Alicerole: Developerskills:- Python- JavaScript- name: Bobrole: Designerskills:- Photoshop- Illustrator
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config3.yaml");// 读取 employees 列表YAML::Node employees = config["employees"];if (employees) {// 遍历 employees 列表for (const auto& employee : employees) {cout << "Name: " << employee["name"].as<string>() << endl;cout << "Role: " << employee["role"].as<string>() << endl;// 读取技能列表YAML::Node skills = employee["skills"];cout << "Skills: ";for (const auto& skill : skills) {cout << skill.as<string>() << " ";}cout << endl << endl;}} else {cout << "No 'employees' node found in the YAML file." << endl;}return 0;
}

(4)代码4:列表中的字典

#列表中的字典
tasks:- name: Task 1completed: false- name: Task 2completed: true- name: Task 3completed: false
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config4.yaml");// 读取 tasks 列表YAML::Node tasks = config["tasks"];if (tasks) {// 遍历 tasks 列表for (const auto& task : tasks) {cout << "Task Name: " << task["name"].as<string>() << endl;cout << "Completed: " << (task["completed"].as<bool>() ? "Yes" : "No") << endl;cout << endl;}} else {cout << "No 'tasks' node found in the YAML file." << endl;}return 0;
}

(5)代码5:多行字符串和列表

#多行字符串和列表
description: |This is a multiline string.It will preserve the newlinesexactly as they are written.
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config5.yaml");// 读取 description 多行字符串YAML::Node description = config["description"];if (description) {// 输出多行字符串cout << "Description:\n" << description.as<string>() << endl;} else {cout << "No 'description' node found in the YAML file." << endl;}return 0;
}

(6)代码6:列表中的混合数据类型

#列表中的混合数据类型
data:- 42- "Hello"- true- { key: value }- [1, 2, 3]
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config6.yaml");// 读取 data 列表YAML::Node data = config["data"];if (data) {// 遍历 data 列表for (const auto& item : data) {// 判断数据类型并输出if (item.IsScalar()) {// 如果是标量类型(如整数、字符串、布尔值)cout << "Scalar: " << item.as<string>() << endl;} else if (item.IsMap()) {// 如果是字典(Map)cout << "Map: " << endl;for (const auto& pair : item) {cout << "  " << pair.first.as<string>() << ": " << pair.second.as<string>() << endl;}} else if (item.IsSequence()) {// 如果是列表(Sequence)cout << "Sequence: ";for (const auto& elem : item) {cout << elem.as<int>() << " ";  // 假设元素是整数类型}cout << endl;}}} else {cout << "No 'data' node found in the YAML file." << endl;}return 0;
}

(7)代码7:列表中的复合数据

#列表中的复合数据
projects:- name: Project 1description: "This is the first project."tasks:- task1- task2- name: Project 2description: "This is the second project."tasks:- task3- task4
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打开并加载 YAML 文件YAML::Node config = YAML::LoadFile("config7.yaml");// 读取 projects 列表YAML::Node projects = config["projects"];if (projects) {// 遍历 projects 列表for (const auto& project : projects) {// 输出项目的基本信息cout << "Project Name: " << project["name"].as<string>() << endl;cout << "Description: " << project["description"].as<string>() << endl;// 读取 tasks 列表YAML::Node tasks = project["tasks"];if (tasks) {cout << "Tasks: ";// 遍历任务列表for (const auto& task : tasks) {cout << task.as<string>() << " ";}cout << endl;}cout << endl;}} else {cout << "No 'projects' node found in the YAML file." << endl;}return 0;
}



五、YAML的优缺点

缺点:
①YAML对缩进敏感,一般是两个空格作为缩进
②解析速度比json慢



六、YAML与其他格式的对比

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antvX6自定义 HTML 节点创建与更新教程

自定义 HTML 节点创建与更新教程 本文详细介绍如何利用 HTML、CSS 和 JavaScript 创建自定义节点&#xff0c;并通过动态更新节点数据来改变节点显示效果。无论你是否有前端基础&#xff0c;都能轻松跟着本教程一步步实现。 1. 基础样式设置 首先&#xff0c;使用 CSS 定义基…

前端开发工厂模式的优缺点是什么?

一、什么是工厂模式&#xff1f; 工厂模式属于创建型设计模式&#xff0c;核心思想是将对象的实例化过程封装到特定方法或类中&#xff0c;让客户端不需要直接通过new关键字创建对象。 举个例子&#xff1a;就像奶茶店不需要顾客自己调配饮品&#xff0c;而是通过"点单-…

Element-plus弹出框popover,使用自定义的图标选择组件

自定义的图标选择组件是若依的项目的 1. 若依的图标选择组件 js文件&#xff0c;引入所有的svg图片 let icons [] // 注意这里的路径&#xff0c;一定要是自己svg图片的路径 const modules import.meta.glob(./../../assets/icons/svg/*.svg); for (const path in modules)…

openmv用了4个了,烧了2个,质量堪忧啊

都是原装货&#xff0c;主板出现过存储不完全、图像存不上、主板代码保存乱码、意外出现乱码的现象。 希望要用的童鞋谨慎使用。

基于DrissionPage的Taptap热门游戏数据爬虫实战:从Requests到现代爬虫框架的迁移指南(含完整代码复制)

目录 ​编辑 一、项目重构背景与技术选型 1.1 原代码问题分析 1.2 DrissionPage框架优势 二、环境配置与基础改造 2.1 依赖库安装 2.2 基础类改造 三、核心功能模块重构 3.1 请求参数自动化生成 3.2 智能页面渲染 3.3 数据解析优化 四、数据库操作增强 4.1 批量插入…

解析K8S四层网络设计

模仿七层网络模型&#xff0c;抽象出四层模型 POD网络 同一节点上的pod网络 依赖于虚拟网桥/网卡&#xff08;linux虚拟设备&#xff09;pod内容器共享网络栈&#xff08;pause容器创建&#xff09; 不同节点上的pod网络 路由方案&#xff1a;依赖于底层网络设备&#x…

FPGA实现数码管显示分秒时间

目录 一. verilog实现 二. 烧录验证 三. 结果验证 使用开发板&#xff1a;DE2-115开发板 一. verilog实现 要实现分和秒&#xff0c;需要知道定时器的频率&#xff0c;通过查手册可知&#xff0c;我使用的开发板时钟为50hz&#xff0c;也就是时钟一个周期是2微秒。 5000000…

Spring 核心技术解析【纯干货版】- XVI:Spring 网络模块 Spring-WebMvc 模块精讲

在现代 Web 开发中&#xff0c;高效、稳定、可扩展的框架至关重要。Spring WebMvc 作为 Spring Framework 的核心模块之一&#xff0c;为开发人员提供了强大的 MVC 体系支持&#xff0c;使得 Web 应用的构建更加便捷和规范。无论是传统的 JSP 视图渲染&#xff0c;还是基于 RES…

MySQL系统库汇总

目录 简介 performance_schema 作用 分类 简单配置与使用 查看最近执行失败的SQL语句 查看最近的事务执行信息 sys系统库 作用 使用 查看慢SQL语句慢在哪 information_schema 作用 分类 应用 查看索引列的信息 mysql系统库 权限系统表 统计信息表 日志记录…

标题:利用 Rork 打造定制旅游计划应用程序:一步到位的指南

引言&#xff1a; 在数字化时代&#xff0c;旅游计划应用程序已经成为旅行者不可或缺的工具。但开发一个定制的旅游应用可能需要耗费大量时间与精力。好消息是&#xff0c;Rork 提供了一种快捷且智能的解决方案&#xff0c;让你能轻松实现创意。以下是使用 Rork 创建一个定制旅…

GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议

蓝牙的 GATT&#xff08;Generic Attribute Profile&#xff09; 是蓝牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;简称BLE&#xff09;协议栈中的一个核心协议&#xff0c;用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT&#xff08;Attribute Proto…

[ deepseek 指令篇章 ]300个领域和赛道喂饭级deepseek指令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

数据结构 -- 图的存储

图的存储 邻接矩阵法 邻接矩阵存储不带权图 0 - 表示两个顶点不邻接 1 - 表示两个顶点邻接 在无向图中&#xff0c;每条边在矩阵中对应两个1 在有向图中&#xff0c;每条边在矩阵中对应一个1 //不带权图的邻接矩阵存储 #define MaxVertexNum 100 //顶点数目的最大值 typed…

25.4.4错题分析

计算机组成原理 总线特点 考察总线特点&#xff0c;串行总线&#xff0c;一次只传1bit&#xff0c;采用单条电缆&#xff0c;抗干扰能力强&#xff0c;传输距离较远&#xff0c;成本低&#xff0c;但传输速度慢&#xff0c;延迟较高&#xff0c;不适用大规模数据传输 并行总线…

规则引擎Drools

1.规则引擎概述 1.1 什么是规则引擎 规则引擎 全称为业务规则管理系统&#xff0c;英文名为BRMS&#xff0c;规则引擎的主要思想是将应用程序中的业务决策部分分离出来&#xff0c;并使用预定义的语义模块编写业务规则&#xff0c;由用户或开发者在需要时进行配置和管理。 需…

框架PasteForm实际开发案例,换个口味显示数据,支持echarts,只需要标记几个特性即可在管理端显示(2)

PasteForm框架的主要思想就是对Dto进行标记特性,然后管理端的页面就会以不一样的UI呈现 使用PasteForm框架开发,让你免去开发管理端的烦恼,你只需要专注于业务端和用户端! 在管理端中,如果说表格是基本的显示方式,那么图表chart就是一个锦上添花的体现! 如果一个项目拥…

【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆

在 Visual Studio 中使用 Dotfuscator 进行混淆 Dotfuscator 是 Visual Studio 自带的混淆工具&#xff08;Dotfuscator Community Edition&#xff0c;简称 CE&#xff09;。它可以混淆 C# 类库&#xff08;DLL&#xff09;或应用程序&#xff08;EXE&#xff09;&#xff0c…

线程同步与互斥(上)

上一篇&#xff1a;线程概念与控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们学习了线程的控制及其相关概念之后&#…

[Linux系统编程]进程信号

进程信号 1. 信号入门1.1 信号基本概念1.2 技术应用角度的信号2. 信号的产生2.1 通过终端按键(如键盘)产生信号2.2 通过异常产生信号2.3 调用系统函数向进程发信号2.4 由软件条件产生信号2.5 总结3. 阻塞信号3.1 信号其他相关常见概念3.2 内核中的信号表示3.3 sigset_t3.3.1 …

要素的选择与转出

1.要素选择的三种方式 当要在已有的数据中选择部分要素时&#xff0c;ArcMap提供了三种方式:按属性选择、位置选择及按图形选择。 1)按属性选择 通过设置 SQL查询表达式&#xff0c;用来选择与选择条件匹配的要素。 (1)单击主菜单下【选择】【按属性选择】&#xff0c;打开【按…