使用libyaml生成YAML文件,如何直接移除首尾的---和...
解决libyaml生成YAML首尾标记的问题
libyaml 默认会生成文档开始标记---和结束标记...,要直接移除这些标记,关键是调整输出时的事件流控制:
- 初始化
yaml_emitter_t后,不要发送YAML_STREAM_START_EVENT和YAML_STREAM_END_EVENT,直接从你需要的内容事件(比如映射、序列、标量)开始发送。 - 举个C语言示例片段:
yaml_emitter_t emitter; yaml_emitter_initialize(&emitter); yaml_emitter_set_output_file(&emitter, stdout); // 不要发送YAML_STREAM_START_EVENT yaml_mapping_start_t mapping_start = {YAML_MAPPING_START_EVENT, NULL, NULL, 0, YAML_ANY_MAPPING_STYLE}; yaml_emitter_emit(&emitter, (yaml_event_t*)&mapping_start); // 这里添加你的键值对、列表等内容事件 yaml_mapping_end_t mapping_end = {YAML_MAPPING_END_EVENT}; yaml_emitter_emit(&emitter, (yaml_event_t*)&mapping_end); // 不要发送YAML_STREAM_END_EVENT yaml_emitter_delete(&emitter);
这样生成的YAML就不会包含首尾的---和...标记。
更高级的YAML生成库推荐
如果你不想手动处理事件流、注释、列表这些重复工作,根据不同编程语言推荐几个库:
- C/C++:
yaml-cpp:封装了libyaml,提供面向对象的API,支持直接构建YAML节点、添加注释、生成序列/映射,无需手动处理底层事件。libyamlpp:轻量的C++封装,简化YAML的生成与解析。
- Python:
PyYAML:直接支持YAML的序列化/反序列化,能轻松生成带注释、列表的结构,底层基于libyaml但完全不需要处理事件。
- Java:
SnakeYAML:成熟的YAML库,支持自定义注释、复杂数据结构的生成,API简洁易用。
这些库都封装了底层的事件处理逻辑,让你专注于YAML内容的构建,不用重复造轮子。
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

