首页 > 编程语言 >yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)

yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)

时间:2023-04-05 11:36:22浏览次数:56  
标签:node yaml element YAML 文件格式 cpp node2

yaml-cpp YAML格式处理库的介绍和使用(面向业务编程-文件格式处理)

YAML格式介绍

YAML的格式介绍,有关ini、json和xml或许很多人已经很了解了,但是关于YAML,还有许多人不了解。YAML被设计成更适合人类阅读(我想正因为如此,所以相对来说更灵活,就导致到使用的时候很多人会觉得它看起来并不严谨)。它的想法类似于Python,去掉了括号和标签,看起来就比较简洁。废话不多说,直接开搞

下面这篇文章有介绍它的一些语法规则

https://zhuanlan.zhihu.com/p/145173920

官网地址:https://yaml.org/

C++关于YAML的库好像找来找去就只有yaml-cpp这个库,并且官网也展示了这个库

yaml-cpp

yaml-cpp是一个C++的YAML解析处理库,符合YAML1.2规范

仓库地址:

https://github.com/jbeder/yaml-cpp

好了,正式开始使用yaml-cpp

以下使用示例均参考自知乎文章https://zhuanlan.zhihu.com/p/96831410

引入头文件

#include "yaml-cpp/yaml.h"
#include <iostream>

声明一个节点

首先,我们声明一个节点

YAML::Node node;

节点声明之后是null类型可以用node.IsNull()判断

键值对

node["key"] = "value";

直接用[]运算符可以像map一样访问

上面这样表示将键key的值设置为value

node["number"] = 255;

也可以赋值为数字,可以用node.IsMap()去查看当前是不是Map类型

Sequence类型(其实就是数组)

node["seq"].push_back("first element");
node["seq"].push_back("second element");

上面代码表示seq是一个数组,数组的内容有first element和second element。

不给名字的Sequence

YAML::Node node2;  
node2.push_back("first item");
node2.push_back("second_item");
node2.push_back("third_item");

当不给下标,直接push_back的时候,node2就是一个Sequence类型

插入一个数组

当然除了字符串,也可以插入一个数组

std::vector<int> v = {1,3,5,7,9};
node.push_back(v);

插入的数组即是一个Sequence,Sequence类型可以用node.IsSequence()来判断是不是Sequence

访问Sequence类型

对于Sequence类型可以用下标访问

assert(node2[0].as<std::string>() == "first item");

也可以用迭代器访问

for(auto it = node2.begin();; it != node2.end(); it++)
    std::cout << *(it) << std::endl;

将一个节点作为另一个节点的子项

 node["node2"] = node2;

给key设置别名,类似于指针

node["pointer_to_first_element"] = node["seq"][0];
// 可以用pointer_to_first_element来访问seq的0号节点
node["pointer_to_first_element"] = "hahaha";

删除一个节点

指定一个node来删除这个节点

node.remove(node["seq"][0]);

也可以指定一个key来删除一个节点,注意这个删除的是指针节点,而非原节点

node.remove("pointer_to_first_element");

怎么读取解析

yaml-cpp可以支持流读取

try {
    std::ifstream fin("test.yaml");
    YAML::Parser parser(fin);
    YAML::Node doc;
    parser.GetNextDocument(doc);
    // do stuff
} catch(YAML::ParserException& e) {
    std::cout << e.what() << "\n";
}

怎么写入到文件

同样使用流的方式写入到文件

std::ofstream file("test.yaml");
file << node <<std::endl;

更多相关操作,或者使用Emitting操作,可以参考官方仓库的docs

https://github.com/jbeder/yaml-cpp/tree/master/docs

以库的形式添加到项目中

本文为作者原创文章,转载请注明出处:https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html

yaml-cpp以库的形式添加到项目中

mkdir UseYaml-cppProject && cd UseYaml-cppProject
git clone https://github.com/jbeder/yaml-cpp.git
vim CMakeLists.txt

CMakeLists.txt文件内容如下

# CMakeLists.txt example,by https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(useYaml-cpp LANGUAGES CXX)

# lib yaml-cpp
include_directories(yaml-cpp/include)
add_subdirectory(yaml-cpp lib)

# executable output
add_executable(useYaml-cpp main.cpp)
target_link_libraries(useYaml-cpp yaml-cpp)

CMakeLists.txt文件就不多解释了,add_executable需要加到add_subdirectory的下面

在项目目录再新建一个main.cpp文件,main.cpp文件内容如下

#include <iostream>
#include "yaml-cpp/yaml.h"

int main() {
    YAML::Node node;
    node["number"] = 255;
    node["string"] = "sample str";

    YAML::Node subNode;
    subNode.push_back("element 1");
    subNode.push_back("element 2");
    node["sub"] = subNode;

    std::cout << node << std::endl;
}

写完之后创建目录并编译

mkdir build && cd build
cmake .. && make

编译后生成useYaml-cpp文件,运行后输出结果如下:

number: 255
string: sample str
sub:
  - element 1
  - element 2

交叉编译?

有时候我们希望它可以跨平台,那么只需要在cmake配置的时候指定交叉编译工具即可

cmake -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..

标签:node,yaml,element,YAML,文件格式,cpp,node2
From: https://www.cnblogs.com/nbtech/p/use_yaml-cpp_library.html

相关文章

  • JsonCpp JSON格式处理库的介绍和使用(面向业务编程-文件格式处理)
    JsonCppJSON格式处理库的介绍和使用(面向业务编程-文件格式处理)介绍JSON是一种轻量级的数据交换格式,它是一种键值对的集合。它的值可以是数字、字符串、布尔值、序列。想知道更多有关JSON格式的介绍,可以到JSON的官网json.org学习JsonCpp是一个c++库,允许对JSON值进行操作,包括......
  • 学习 YAML 语法
    符号意义备注-表示数组数组也叫序列#表示注释只支持单行注释空格缩进表示层级关系相同层级左侧必须对齐---表示一份内容的开始...表示一份内容的结束可省略:表示键值对数据冒号有有空格&name设置锚点*name引用锚点配合"<<"合并......
  • Python配置文件管理之ini和yaml文件读取
    当我们设计软件时,我们通常会花费大量精力来编写高质量的代码。但这往往还不够,一个好的软件还应该考虑其整个系统,如测试、部署、网络等。其中最重要的一个方面是配置管理。良好的配置管理应允许在任何环境中执行软件而不更改代码。最常见的配置包括数据库认证配置、部署服务器的主......
  • python接口自动化pytest+yaml+allure
    简介分层common公共层data数据层test层+main文件其中pytest框架使用pytest.ini全局配置和conftest.py夹具test层下载对于的安装包编写对于的用例实现参数化编写对于的fixture和pytest全局配置常用pytest执行方法main方法:pytest.main(['-vs','-n2'])console:py......
  • K8S用yaml资源清单部署redis数据库,数据持久化保存
    1.创建redis存储数据目录和配置文件mkdir-p/data/redis/redis-config/touch/data/redis/redis-config/redis.confcat>>/data/redis/redis-config/redis.conf<<EOFrequirepass123456bind0.0.0.0save9001save30010save6010000EOF2.编写redis的yaml资源清单api......
  • k8s快速生成yaml的两种方式
    第一.kubectlcreate命令[root@k8s-master~]#kubectlcreatedeploymentnginx--image=nginx-oyaml--dry-run#不创建pod,打印出来W010616:21:43.89167917615helpers.go:663]--dry-runisdeprecatedandcanbereplacedwith--dry-run=client.apiVersion:apps/v......
  • shell报错:bash:./xxx: 无法执行二进制文件: 可执行文件格式错误
    shell报错:bash:./xxx:无法执行二进制文件:可执行文件格式错误在ubuntu下运行一个可执行文件,但是出现错误:由于文件已经拥有可执行权限,遂考虑是不是该文件编译时的CPU指......
  • 使用excelize把xlsx转换为yaml
    packagemainimport("fmt""github.com/360EntSecGroup-Skylar/excelize/v2""gopkg.in/yaml.v2""io/ioutil""os")funcmain(){xlsx,......
  • ncnn param文件格式
    一、ncnn模型可由ncnn库中的onnx2ncnn工具将onnx格式模型转换为ncnn格式的.param和.bin两个文件,其中param记录了各算子,param文件可直接由可视化工具Nerton打开查看,这里记......
  • .md文件格式详解,即markdown文件语法。记笔利器
    Markdown是一种轻量级的标记语言。Markdown虽然功能不是很强大,但是非常简单好用1、标题(#)标题(h1~h6标签)格式:#一级标题##二级标题###三级标题2、段落(空行)段落......