YAML文件是一种人类可读的数据序列化格式,常用于配置文件和数据交换。它使用缩进和换行来表示层级关系,具有简洁、可读性强的特点。
YAML文件常见的用途
配置文件 | YAML文件常用于存储应用程序的配置信息。通过YAML格式,可以轻松地定义和组织各种配置选项,例如数据库连接信息、日志级别、服务器设置等。 |
数据交换 | YAML文件可以用做不同系统之间交换数据的格式。由于YAML的可读性强,它成为了一种常见的数据交换格式,用在不同应用程序之间传输和共享数据。 |
测试数据 | YAML文件可以用于定义测试数据,特别是在自动化测试中。测试数据可以包括输入数据、预期输出、测试条件等,以便在测试过程中使用。 |
API文档 | YAML文件可以用于编写API文档。通过使用YAML格式,可以清晰定义API的各个端点、参数、请求和响应格式等信息,以便开发人员和用户更好地理解和使用API。 |
构建工具 | 许多构建工具(如Jenkins、Travis CI等)使用YAML文件来定义构建和部署流程。通过使用YAML格式,可以轻松地定义构建步骤、依赖关系、环境变量等信息。 |
这只是一些常见的用途,实际上,YAML文件可以在许多其他领域和场景中使用。由于其简洁性和可读性,YAML成为了一种流行的数据序列化格式。
YAML文件语法
YAML对缩进非常敏感,因此正确的缩进是确保文件能够得到正确解析的关键。
键值对:使用冒号 : 将键和值分隔。键和值之间使用一个或多个空格进行缩进。如:
name: John Doe
age: 30
列表:使用短横杠 - 表示列表项。列表项可以是任何类型的值,包括字符串、数字、布尔值等。如:
hobbies:
- reading
- hiking
- cooking
嵌套结构:使用缩进表示层级关系。嵌套结构可以包含键值对、列表或其他嵌套结构。如:
address:
street: 123 Main St
city: New York
country: USA
注释:使用井号 # 表示注释。注释可以出现在行的任何位置,并且从井号开始一直到行末为止。如:
# 这是一个注释
name: John Doe # 这也是一个注释
引用:可以使用引用来重复使用相同的值或结构。使用 & 定义引用,使用 * 引用已定义的引用,如:
defaults: &defaults
timeout: 30
retries: 3
server:
<<: *defaults
address: example.com
在上述示例中,<<
是YAML中的合并键。它允许将一个映射(即YAML中的键值对集合)合并到另一个映射中,减少重复输入。
在这个例子中,defaults是一个键,&defaults是将整个映射设置为一个引用。timeout和retries是defaults映射的键值对。
server是另一个映射,通过使用<<
合并键,可以将defaults映射合并到server映射中。这意味着server映射会继承defaults中的键值对。所以sever映射最终会包含timeout、retries和address这三个键值对。
YAML文件解析
非常遗憾,Qt框架中并没有直接支持解析YAML文件的类,可以使用第三方库yaml-cpp来解析YAML文件。
首先需要下载和安装yaml-cpp库:
yaml-cpp官方GitHub页面:GitHub - jbeder/yaml-cpp: A YAML parser and emitter in C++
下载完成后,按照文档中的指示进行编译和安装。
在Qt项目中引入yaml-cpp库,需要在Qt项目中包含yaml-cpp库的头文件和链接yaml-cpp的库文件。
需要在Qt项目文件中加入 LIBS+= -lyaml-cpp
解析
#include <yaml-cpp/yaml.h>
// 读取并解析YAML文件
YAML::Node config = YAML::LoadFile("config.yaml");
// 检索YAML中的值
std::string name = config["name"].as<std::string>();
int age = config["age"].as<int>();
// 将值打印到控制台
qDebug() << "Name: " << QString::fromStdString(name);
qDebug() << "Age: " << age;
生成
#include <yaml-cpp/yaml.h>
// 创建一个YAML节点并设置值
YAML::Node config;
config["name"] = "John Doe";
config["age"] = 30;
// 将YAML节点写入文件
std::ofstream fout("config.yaml");
fout << config;
// 关闭文件流
fout.close();