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

科技资讯 投稿 7300 0 评论

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

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

YAML格式介绍

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

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

yaml-cpp

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

https://github.com/jbeder/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一样访问

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类型

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://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++ ..

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

赞同 (31) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽