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; #define MLSERVERCONF "./ML_Alg.yaml" int main(void) { // 1. 創建yaml 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來刪除它 //rootnode << "comment: keep something usefull. #註釋保留"; // 終端輸出。 //std::cout << rootnode << endl; // 保存爲yaml格式文件。 std::ofstream file(MLSERVERCONF); file << rootnode <<std::endl; file.close(); // 2. 解析 YAML::Node mlserver_node; try{ mlserver_node = YAML::LoadFile(MLSERVERCONF); // cout << mlserver_node << endl; }catch(YAML::BadFile &e){ perror("YAML::Load(MLSERVERCONF) failed.\n"); return 1; } if(!mlserver_node["MLServer"] || !mlserver_node["MLServer"].IsMap()) { printf("no MLServer\n"); return 2; } YAML::Node ml_root_node = mlserver_node["MLServer"]; for(YAML::const_iterator iter = ml_root_node.begin(); iter != ml_root_node.end(); ++iter) { string ChildName = iter->first.as<string>(); printf("ChildName:%s\n", ChildName.c_str()); // MultiAddr節點解析 if(0 == ChildName.compare("MultiAddr") && iter->second.IsSequence()) { for(int i = 0; i < iter->second.size(); ++i) { if(iter->second[0]["ip"] && iter->second[0]["ip"].IsScalar()) { string str_ip = iter->second[0]["ip"].as<string>(); printf("str_ip:%s\n", str_ip.c_str()); } } }else if(0 == ChildName.compare("Nodes") && iter->second.IsMap()) // Nodes節點解析 { for(YAML::const_iterator node_iter = iter->second.begin(); node_iter != iter->second.end(); ++node_iter) { string node_name = node_iter->first.as<string>(); if(0 == node_name.compare("Midware")) { YAML::Node module_node = node_iter->second; if(module_node["CpuModel"] && module_node["CpuModel"].IsScalar()) { string str_cpu_model = module_node["CpuModel"].as<string>(); printf("str_cpu_model:%s\n", str_cpu_model.c_str()); } } } }else if(0 == ChildName.compare("Version") && iter->second.IsScalar()) { string str_version = iter->second.as<string>(); printf("str_version:%s\n", str_version.c_str()); } } //YAML::Emitter out; return 0; }