YAML格式处理C函数库-libYAML
2024-10-21 09:44:45 阿炯

在软件开发中有关的配置和数据交换格式多种多样,而 YAML(YAML Ain't Markup Language)以其简洁、易读和强大的表达能力受到了广泛的关注。libYAML 就是一个用于处理 YAML 格式数据的强大库。采用MIT协议授权。

LibYAML - A C library for parsing and emitting YAML.

YAML 是一种人类可读的数据序列化格式,它的设计目标是使得数据在不同编程语言和系统之间的交换变得更加容易。其的语法非常简洁,易于理解和编写,同时也支持复杂的数据结构,如嵌套的列表和字典、标量值、注释等。以下是一个简单的 YAML 配置文件示例:

name: John FreeOA
age: 30
address:
  street: 123 Main St
  city: Anytown
  state: CA
  zip: 12345
hobbies:
  - reading
  - hiking
  - coding

这个 YAML 文件定义了一个人的基本信息,包括姓名、年龄、地址和爱好。可以看出,YAML 的语法非常直观,不需要过多的标记和括号,使得数据的结构一目了然。


libYAML 是一个用 C 语言实现的 YAML 解析和生成库。它提供了一组函数,可以方便地读取、写入和操作 YAML 格式的数据。libYAML 的主要特点包括:
高效性:libYAML 采用了高效的解析算法,可以快速处理大型的 YAML 文档。

灵活性:支持 YAML 的各种特性,包括嵌套结构、标量类型、序列和映射等。

可扩展性:可以通过自定义类型和解析器来扩展 libYAML 的功能。

跨平台性:可以在多种操作系统和编程语言中使用。

libYAML 的常用方法

解析 YAML 文档

要解析一个 YAML 文档,可以使用 yaml_parser_t 结构体和相关的函数。以下是一个简单的示例代码:
#include <stdio.h>
#include <yaml.h>

int main() {
    yaml_parser_t parser;
    yaml_event_t event;

    // 初始化解析器
    yaml_parser_initialize(&parser);

    // 设置输入文件
    FILE *file = fopen("example.yaml", "r");
    yaml_parser_set_input_file(&parser, file);

    // 读取并处理 YAML 事件
    while (yaml_parser_parse(&parser, &event)) {
        switch (event.type) {
            case YAML_SCALAR_EVENT:
                printf("Scalar: %s\n", event.data.scalar.value);
                break;
            case YAML_SEQUENCE_START_EVENT:
                printf("Sequence start\n");
                break;
            case YAML_SEQUENCE_END_EVENT:
                printf("Sequence end\n");
                break;
            case YAML_MAPPING_START_EVENT:
                printf("Mapping start\n");
                break;
            case YAML_MAPPING_END_EVENT:
                printf("Mapping end\n");
                break;
            default:
                break;
        }
        yaml_event_delete(&event);
    }

    // 清理资源
    yaml_parser_delete(&parser);
    fclose(file);

    return 0;
}

在上面例子中首先初始化了一个 yaml_parser_t 结构体,然后设置输入文件为一个名为 example.yaml 的 YAML 文档。接着使用一个循环来读取并处理 YAML 事件,直到解析完成。最后在清理资源并关闭输入文件。

生成 YAML 文档

要生成一个 YAML 文档,可以使用 yaml_emitter_t 结构体和相关的函数。以下是一个简单的示例代码:
#include <stdio.h>
#include <yaml.h>

int main() {
    yaml_emitter_t emitter;
    yaml_event_t event;

    // 初始化发射器
    yaml_emitter_initialize(&emitter);

    // 设置输出文件
    FILE *file = fopen("output.yaml", "w");
    yaml_emitter_set_output_file(&emitter, file);

    // 开始文档
    yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING);
    yaml_emitter_emit(&emitter, &event);

    // 开始映射
    yaml_mapping_start_event_initialize(&event);
    yaml_emitter_emit(&emitter, &event);

    // 添加键值对
    yaml_scalar_event_initialize(&event, (yaml_char_t *)"name", strlen("name"), 1, 0);
    yaml_emitter_emit(&emitter, &event);
    yaml_scalar_event_initialize(&event, (yaml_char_t *)"John Doe", strlen("John Doe"), 1, 0);
    yaml_emitter_emit(&emitter, &event);

    // 结束映射
    yaml_mapping_end_event_initialize(&event);
    yaml_emitter_emit(&emitter, &event);

    // 结束文档
    yaml_stream_end_event_initialize(&event);
    yaml_emitter_emit(&emitter, &event);

    // 清理资源
    yaml_emitter_delete(&emitter);
    fclose(file);

    return 0;
}

在此例子中首先初始化了一个 yaml_emitter_t 结构体,然后设置输出文件为一个名为 output.yaml 的文件。接着使用一系列的函数来生成 YAML 事件,并通过 yaml_emitter_emit 函数将这些事件发送到输出文件中。最后清理资源并关闭输出文件。


libYAML是一个强大的 YAML 解析和生成库,它为 C 语言开发者提供了一种高效、灵活的方式来处理 YAML 格式的数据。通过了解 YAML 的语法和 libYAML 的常用方法,开发者可以在自己的项目中轻松地使用 YAML 作为配置文件格式或者数据交换格式。无论是小型的脚本还是大型的软件项目,libYAML 都可以为数据处理需求提供有力的支持。

最新版本:0.2
v0.2.5于2020年7月发布。

项目主页:https://github.com/yaml/libyaml