yaml-cpp生成yaml文件及解析yaml文件
1) 源码编译及安装
获取源码
$ git clone https://github.com/jbeder/yaml-cpp.git
$ cd yaml-cpp && mkdir build && cd build && cmake .. && make && make install
使用样例:
由于yaml格式文件与xml和json格式的文件类似,采用树形结构。Yaml对于树节点定义为Node。Node有以下几种type概念:
Null 空节点
Sequence 序列,类似于一个Vector,对应YAML格式中的数组
Map 类似标准库中的Map,对应YAML格式中的对象
Scalar 标量,对应YAML格式中的常量
yaml格式文件MLServerConf.yaml
# 云服务器自学习配置 MLServer: MultiAddr: - ip: 192.168.2.1 mac: 10:10:56:c0:00:01 - ip: 172.16.224.1 mac: 20:10:56:c0:00:08 Version: 3.1.3 Nodes: Midware: enable: 1 Uuid: 3f79ffdd-238c CpuModel: Core(TM) Trans: enable: 1 Uuid: 58f89655-f790 CpuModel: Xron(R)
生成上述MLServerConf.yaml文件源码:
/* * yaml-cpp-test.cpp * * Created on: Aug 9, 2023 * Author: Jule */ #include <iostream> #include <assert.h> #include <fstream> #include <yaml-cpp/yaml.h> using namespace std; int main(void) { YAML::Node ipInfo1; ipInfo1["ip"] = "192.168.2.1"; ipInfo1["mac"] = "10:10:56:c0:00:01"; YAML::Node ipInfo2; ipInfo2["ip"] = "172.16.224.1"; ipInfo2["mac"] = "20:10:56:c0:00:08"; YAML::Node MultiAddr; MultiAddr["MultiAddr"].push_back(ipInfo1); MultiAddr["MultiAddr"].push_back(ipInfo2); YAML::Node Node1; Node1["enable"] = 1; Node1["Uuid"] = "3f79ffdd-238c"; Node1["CpuModel"] = "Core(TM)"; YAML::Node Node2; Node2["enable"] = 1; Node2["Uuid"] = "58f89655-f790"; Node2["CpuModel"] = "Xron(R)"; YAML::Node Nodes; Nodes["Midware"] = Node1; Nodes["Trans"] = Node2; YAML::Node rootnode; assert(rootnode.IsNull()); // 初始化的节点是Null类型 // 1. 创建节点 rootnode["MLServer"] = MultiAddr; // 将MultiAddr作为rootnode的一个子项 rootnode["MLServer"]["Version"] = "3.1.3"; //node.force_insert("MLServer", "nodes");//这个操作和上面等价,但是它不会检查是否存在"key"键,不推荐使用 rootnode["MLServer"]["Nodes"] = Nodes; // rootnode.remove(Nodes);//你可以通过指定一个node来删除它 // rootnode.remove("Version");//你也可以通过指定key来删除它 // 终端输出。 std::cout << rootnode << endl; // 保存为yaml格式文件。 std::ofstream file("ML_Alg.yaml"); file << rootnode <<std::endl; return 0; }