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格式文件與xmljson格式的文件類似,採用樹形結構。Yaml對於樹節點定義爲NodeNode有以下幾種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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章