配置文件 yaml

文章目錄

  • 一、yaml簡介
  • 二、YAML 文件基本語法
    • 1.縮進
    • 2.鍵值對
    • 3.注釋
    • 4.支持多種數據類型
    • 5.示例 YML 文件
  • 三、YAML 文件的基本元素:純量、對象、數組
    • 1.純量(scalars)
      • (1)布爾值(Booleans)
      • (2)Null 值
    • 2.對象(Object) / 映射(Mapping) / 字典(Dictionaries) / 鍵值對(Key-Value Pairs)
    • 3.數組(Array) / 列表(Lists) / 序列(sequence)
    • 4.復合結構 / 嵌套結構(Nested Structures)
    • 5.多行字符串(Multi-line Strings)
      • (1)字面量式 |
      • (2)折疊式 >
  • 四、實戰操作
    • 1.安裝YAML
    • 2.編譯
    • 3.示例代碼
      • (1)代碼1
      • (2)代碼2:列表、try、catch
      • (3)代碼3:嵌套列表
      • (4)代碼4:列表中的字典
      • (5)代碼5:多行字符串和列表
      • (6)代碼6:列表中的混合數據類型
      • (7)代碼7:列表中的復合數據
  • 五、YAML的優缺點
  • 六、YAML與其他格式的對比

一、yaml簡介

YAML(YAML Ain’t Markup Language)是一種標記語言,用于表示數據結構。它最初的目標是成為一種簡潔易讀的數據序列化格式,適用于配置文件、數據交換以及日志等應用。YAML 格式的最大特點是其語法非常簡潔、直觀,尤其適合用于人類閱讀和編輯。YAML 支持復雜的數據結構,如字典、列表、嵌套、引用等,因此非常適合用于描述結構化數據。

YAML(“YAML Ain’t Markup Language”)是一種以數據序列化為主的輕量級標記語言,因其語法簡潔、易讀性高而廣泛用于配置文件、數據交換和存儲。

YAML 文件使用 .yml.yaml 擴展名

YAML 擁有 Perl、C、XML、HTML 和其他編程語言的特性。YAML 也是 JSON 的超集,所以 JSON 文件在 YAML 中有效。
相比 JSON,因為 YAML 有更好的可讀性,對用戶更友好,所以通常建議用 YAML 來編寫配置文件,盡管它們在大多數情況下可以互換使用。



二、YAML 文件基本語法

YAML 文件通常具有以下幾個特點:

1.縮進

YAML 使用空格進行縮進,表示層級關系,推薦使用兩個空格作為縮進單位(但是切勿使用制表符 (Tab),否則可能導致解析錯誤)。

  • 大小寫敏感;
  • 使用縮進表示層級關系;
  • 縮進時不允許使用 Tab 鍵,只允許使用空格;
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可;
  • # 表示注釋
  • :號后面要加空格

2.鍵值對

YAML 中的每個數據項都是一個鍵值對,鍵和值之間用冒號:分隔,冒號后跟一個空格


3.注釋

注釋用#符號表示,注釋內容從 # 后開始,到行尾結束。【而json文件就不支持注釋】


4.支持多種數據類型

YAML 支持字符串、整數、浮動點數、布爾值、Null、日期等類型


5.示例 YML 文件

# 這是一個簡單的YML示例
server:host: localhost  # 服務器地址port: 8080       # 端口號database:name: mydbuser: adminpassword: secret123tables:- users- orders- productsenabled: true



三、YAML 文件的基本元素:純量、對象、數組

YAML 的基本數據結構只有三種:純量(Scalar)、映射(Mapping) 和 序列(Sequence),分別對應單個值、有序列表和鍵值對集合:
①純量:最基本的,不可再分的值;
②對象:mapping/hash/dictionary:鍵值對的集合;
③數組:sequence/list:一組按次序排列的值;數組和對象可以構成復合結構;


1.純量(scalars)

純量是最基本的、不可再分的值。

以下數據類型都屬于 JavaScript 的純量:

  • 字符串
  • 布爾值
  • 整數
  • 浮點數
  • null:用 ~ 表示
  • 時間
  • 日期
boolean: - TRUE  #true,True都可以- FALSE  #false,False都可以
float:- 3.14- 6.8523015e+5  #可以使用科學計數法
int:- 123- 0b1010_0111_0100_1010_1110    #二進制表示
null:nodeName: 'node'parent: ~  #使用~表示null
string:- 哈哈- 'Hello world'  #可以使用雙引號或者單引號包裹特殊字符- newlinenewline2    #字符串可以拆成多行,每一行會被轉化成一個空格
date:- 2018-02-17    #日期必須使用ISO 8601格式,即yyyy-MM-dd
datetime: -  2018-02-17T15:02:31+08:00    #時間使用ISO 8601格式,時間和日期之間使用T連接,最后使用+代表時區

(1)布爾值(Booleans)

布爾值可以用 true 或 false 來表示,YAML 還允許使用 yes、no、on、off 等值來表示布爾類型。

is_active: true
is_enabled: yes

(2)Null 值

null 值可以使用 null 或 ~ 來表示。

value1: null
value2: ~

2.對象(Object) / 映射(Mapping) / 字典(Dictionaries) / 鍵值對(Key-Value Pairs)

YAML 中最基本的元素是鍵值對,格式為 key: value

(1)鍵值對:

name: John Doe
age: 30

(2)對象:

key: child-key: valuechild-key2: value2

(3)字典:
字典是由多個鍵值對組成的集合。在 YAML 中,字典的嵌套通過縮進來表示。

person:name: John Doeage: 30address:street: 123 Main Stcity: New Yorkzip: 10001

3.數組(Array) / 列表(Lists) / 序列(sequence)

YAML 使用 - 符號來表示列表項。每個列表項占據一行,且列表項之間通過換行分隔。

以 - 開頭的行表示構成一個數組:

fruits:- Apple- Orange- Banana

4.復合結構 / 嵌套結構(Nested Structures)

YAML 通過縮進表示嵌套結構。可以在字典中嵌套列表,在列表中嵌套字典,或者在字典中嵌套其他字典。

team:- name: Alicerole: Developerskills:- Python- JavaScript- name: Bobrole: Designerskills:- Photoshop- Sketch
languages:- Ruby- Perl- Python 
websites:YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org

5.多行字符串(Multi-line Strings)

YAML 支持多行字符串的表示,有兩種方式:字面量式(literal style) 和 折疊式(folded style)。

(1)字面量式 |

字面量式:用 | 表示,將多行文本保留原格式,換行會被保留。

description: |This is a long descriptionthat spans multiple lines,and it will be preserved asmultiple lines in the output.

(2)折疊式 >

折疊式:用 > 表示,將多行文本折疊成一個字符串,換行會被替換為空格。

description: >This is a long descriptionthat spans multiple lines,but it will be collapsed into asingle line.



四、實戰操作

1.安裝YAML

sudo apt-get install libyaml-cpp-dev

2.編譯

編譯要加連接選項:-lyaml-cpp,即

g++ read_yaml.cpp -o read_yaml -lyaml-cpp

3.示例代碼

(1)代碼1

config.yaml

name: MyYAML
version: 0.1
description: "A simple YAML configuration file"
enabled: true

read_yaml.cpp

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>
using std::cout;
using std::endl;
using std::string;int main() {// 讀取 YAML 文件YAML::Node config = YAML::LoadFile("config.yaml");// 讀取配置項string name        = config["name"].as<string>();          // 獲取 'name' 字段double version     = config["version"].as<double>();       // 獲取 'version' 字段string description = config["description"].as<string>();   // 獲取 'description' 字段bool enabled       = config["enabled"].as<bool>();         // 獲取 'enabled' 字段// 輸出配置項cout << "Name: "        << name                      << endl;cout << "Version: "     << version                   << endl;cout << "Description: " << description               << endl;cout << "Enabled: "     << std::boolalpha << enabled << endl;return 0;
}

(2)代碼2:列表、try、catch

config2.yaml

#基本的列表結構
fruits:- Apple- Banana- Orange

不帶try-catch的版本:

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config2.yaml");// 讀取 fruits 列表YAML::Node fruits = config["fruits"];if (fruits) {// 遍歷 fruits 列表for (const auto& fruit : fruits) {cout << fruit.as<string>() << endl;}} else {cout << "No 'fruits' node found in the YAML file." << endl;}return 0;
}

帶 try-catch的版本:

#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {try {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config2.yaml");// 讀取 fruits 列表YAML::Node fruits = config["fruits"];if (fruits) {// 遍歷 fruits 列表for (const auto& fruit : fruits) {cout << fruit.as<string>() << endl;}} else {cout << "No 'fruits' node found in the YAML file." << endl;}} catch (const YAML::Exception& e) {cerr << "Error reading YAML file: " << e.what() << endl;return 1;}return 0;
}

(3)代碼3:嵌套列表

#嵌套列表
employees:- name: Alicerole: Developerskills:- Python- JavaScript- name: Bobrole: Designerskills:- Photoshop- Illustrator
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config3.yaml");// 讀取 employees 列表YAML::Node employees = config["employees"];if (employees) {// 遍歷 employees 列表for (const auto& employee : employees) {cout << "Name: " << employee["name"].as<string>() << endl;cout << "Role: " << employee["role"].as<string>() << endl;// 讀取技能列表YAML::Node skills = employee["skills"];cout << "Skills: ";for (const auto& skill : skills) {cout << skill.as<string>() << " ";}cout << endl << endl;}} else {cout << "No 'employees' node found in the YAML file." << endl;}return 0;
}

(4)代碼4:列表中的字典

#列表中的字典
tasks:- name: Task 1completed: false- name: Task 2completed: true- name: Task 3completed: false
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config4.yaml");// 讀取 tasks 列表YAML::Node tasks = config["tasks"];if (tasks) {// 遍歷 tasks 列表for (const auto& task : tasks) {cout << "Task Name: " << task["name"].as<string>() << endl;cout << "Completed: " << (task["completed"].as<bool>() ? "Yes" : "No") << endl;cout << endl;}} else {cout << "No 'tasks' node found in the YAML file." << endl;}return 0;
}

(5)代碼5:多行字符串和列表

#多行字符串和列表
description: |This is a multiline string.It will preserve the newlinesexactly as they are written.
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config5.yaml");// 讀取 description 多行字符串YAML::Node description = config["description"];if (description) {// 輸出多行字符串cout << "Description:\n" << description.as<string>() << endl;} else {cout << "No 'description' node found in the YAML file." << endl;}return 0;
}

(6)代碼6:列表中的混合數據類型

#列表中的混合數據類型
data:- 42- "Hello"- true- { key: value }- [1, 2, 3]
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config6.yaml");// 讀取 data 列表YAML::Node data = config["data"];if (data) {// 遍歷 data 列表for (const auto& item : data) {// 判斷數據類型并輸出if (item.IsScalar()) {// 如果是標量類型(如整數、字符串、布爾值)cout << "Scalar: " << item.as<string>() << endl;} else if (item.IsMap()) {// 如果是字典(Map)cout << "Map: " << endl;for (const auto& pair : item) {cout << "  " << pair.first.as<string>() << ": " << pair.second.as<string>() << endl;}} else if (item.IsSequence()) {// 如果是列表(Sequence)cout << "Sequence: ";for (const auto& elem : item) {cout << elem.as<int>() << " ";  // 假設元素是整數類型}cout << endl;}}} else {cout << "No 'data' node found in the YAML file." << endl;}return 0;
}

(7)代碼7:列表中的復合數據

#列表中的復合數據
projects:- name: Project 1description: "This is the first project."tasks:- task1- task2- name: Project 2description: "This is the second project."tasks:- task3- task4
#include <iostream>
#include <fstream>
#include <yaml-cpp/yaml.h>using namespace std;int main() {// 打開并加載 YAML 文件YAML::Node config = YAML::LoadFile("config7.yaml");// 讀取 projects 列表YAML::Node projects = config["projects"];if (projects) {// 遍歷 projects 列表for (const auto& project : projects) {// 輸出項目的基本信息cout << "Project Name: " << project["name"].as<string>() << endl;cout << "Description: " << project["description"].as<string>() << endl;// 讀取 tasks 列表YAML::Node tasks = project["tasks"];if (tasks) {cout << "Tasks: ";// 遍歷任務列表for (const auto& task : tasks) {cout << task.as<string>() << " ";}cout << endl;}cout << endl;}} else {cout << "No 'projects' node found in the YAML file." << endl;}return 0;
}



五、YAML的優缺點

缺點:
①YAML對縮進敏感,一般是兩個空格作為縮進
②解析速度比json慢



六、YAML與其他格式的對比

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76725.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

antvX6自定義 HTML 節點創建與更新教程

自定義 HTML 節點創建與更新教程 本文詳細介紹如何利用 HTML、CSS 和 JavaScript 創建自定義節點&#xff0c;并通過動態更新節點數據來改變節點顯示效果。無論你是否有前端基礎&#xff0c;都能輕松跟著本教程一步步實現。 1. 基礎樣式設置 首先&#xff0c;使用 CSS 定義基…

前端開發工廠模式的優缺點是什么?

一、什么是工廠模式&#xff1f; 工廠模式屬于創建型設計模式&#xff0c;核心思想是將對象的實例化過程封裝到特定方法或類中&#xff0c;讓客戶端不需要直接通過new關鍵字創建對象。 舉個例子&#xff1a;就像奶茶店不需要顧客自己調配飲品&#xff0c;而是通過"點單-…

Element-plus彈出框popover,使用自定義的圖標選擇組件

自定義的圖標選擇組件是若依的項目的 1. 若依的圖標選擇組件 js文件&#xff0c;引入所有的svg圖片 let icons [] // 注意這里的路徑&#xff0c;一定要是自己svg圖片的路徑 const modules import.meta.glob(./../../assets/icons/svg/*.svg); for (const path in modules)…

openmv用了4個了,燒了2個,質量堪憂啊

都是原裝貨&#xff0c;主板出現過存儲不完全、圖像存不上、主板代碼保存亂碼、意外出現亂碼的現象。 希望要用的童鞋謹慎使用。

基于DrissionPage的Taptap熱門游戲數據爬蟲實戰:從Requests到現代爬蟲框架的遷移指南(含完整代碼復制)

目錄 ?編輯 一、項目重構背景與技術選型 1.1 原代碼問題分析 1.2 DrissionPage框架優勢 二、環境配置與基礎改造 2.1 依賴庫安裝 2.2 基礎類改造 三、核心功能模塊重構 3.1 請求參數自動化生成 3.2 智能頁面渲染 3.3 數據解析優化 四、數據庫操作增強 4.1 批量插入…

解析K8S四層網絡設計

模仿七層網絡模型&#xff0c;抽象出四層模型 POD網絡 同一節點上的pod網絡 依賴于虛擬網橋/網卡&#xff08;linux虛擬設備&#xff09;pod內容器共享網絡棧&#xff08;pause容器創建&#xff09; 不同節點上的pod網絡 路由方案&#xff1a;依賴于底層網絡設備&#x…

FPGA實現數碼管顯示分秒時間

目錄 一. verilog實現 二. 燒錄驗證 三. 結果驗證 使用開發板&#xff1a;DE2-115開發板 一. verilog實現 要實現分和秒&#xff0c;需要知道定時器的頻率&#xff0c;通過查手冊可知&#xff0c;我使用的開發板時鐘為50hz&#xff0c;也就是時鐘一個周期是2微秒。 5000000…

Spring 核心技術解析【純干貨版】- XVI:Spring 網絡模塊 Spring-WebMvc 模塊精講

在現代 Web 開發中&#xff0c;高效、穩定、可擴展的框架至關重要。Spring WebMvc 作為 Spring Framework 的核心模塊之一&#xff0c;為開發人員提供了強大的 MVC 體系支持&#xff0c;使得 Web 應用的構建更加便捷和規范。無論是傳統的 JSP 視圖渲染&#xff0c;還是基于 RES…

MySQL系統庫匯總

目錄 簡介 performance_schema 作用 分類 簡單配置與使用 查看最近執行失敗的SQL語句 查看最近的事務執行信息 sys系統庫 作用 使用 查看慢SQL語句慢在哪 information_schema 作用 分類 應用 查看索引列的信息 mysql系統庫 權限系統表 統計信息表 日志記錄…

標題:利用 Rork 打造定制旅游計劃應用程序:一步到位的指南

引言&#xff1a; 在數字化時代&#xff0c;旅游計劃應用程序已經成為旅行者不可或缺的工具。但開發一個定制的旅游應用可能需要耗費大量時間與精力。好消息是&#xff0c;Rork 提供了一種快捷且智能的解決方案&#xff0c;讓你能輕松實現創意。以下是使用 Rork 創建一個定制旅…

GATT(Generic Attribute Profile)是藍牙低功耗(Bluetooth Low Energy,簡稱BLE)協議棧中的一個核心協議

藍牙的 GATT&#xff08;Generic Attribute Profile&#xff09; 是藍牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;簡稱BLE&#xff09;協議棧中的一個核心協議&#xff0c;用于定義設備如何通過藍牙進行數據傳輸和交互。GATT 是基于 ATT&#xff08;Attribute Proto…

[ deepseek 指令篇章 ]300個領域和賽道喂飯級deepseek指令

&#x1f36c; 博主介紹 &#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【數據通信】 【通訊安全】 【web安全】【面試分析】 &#x1f389;點贊?評論?收藏 養成習…

數據結構 -- 圖的存儲

圖的存儲 鄰接矩陣法 鄰接矩陣存儲不帶權圖 0 - 表示兩個頂點不鄰接 1 - 表示兩個頂點鄰接 在無向圖中&#xff0c;每條邊在矩陣中對應兩個1 在有向圖中&#xff0c;每條邊在矩陣中對應一個1 //不帶權圖的鄰接矩陣存儲 #define MaxVertexNum 100 //頂點數目的最大值 typed…

25.4.4錯題分析

計算機組成原理 總線特點 考察總線特點&#xff0c;串行總線&#xff0c;一次只傳1bit&#xff0c;采用單條電纜&#xff0c;抗干擾能力強&#xff0c;傳輸距離較遠&#xff0c;成本低&#xff0c;但傳輸速度慢&#xff0c;延遲較高&#xff0c;不適用大規模數據傳輸 并行總線…

規則引擎Drools

1.規則引擎概述 1.1 什么是規則引擎 規則引擎 全稱為業務規則管理系統&#xff0c;英文名為BRMS&#xff0c;規則引擎的主要思想是將應用程序中的業務決策部分分離出來&#xff0c;并使用預定義的語義模塊編寫業務規則&#xff0c;由用戶或開發者在需要時進行配置和管理。 需…

框架PasteForm實際開發案例,換個口味顯示數據,支持echarts,只需要標記幾個特性即可在管理端顯示(2)

PasteForm框架的主要思想就是對Dto進行標記特性,然后管理端的頁面就會以不一樣的UI呈現 使用PasteForm框架開發,讓你免去開發管理端的煩惱,你只需要專注于業務端和用戶端! 在管理端中,如果說表格是基本的顯示方式,那么圖表chart就是一個錦上添花的體現! 如果一個項目擁…

【工具】在 Visual Studio 中使用 Dotfuscator 對“C# 類庫(DLL)或應用程序(EXE)”進行混淆

在 Visual Studio 中使用 Dotfuscator 進行混淆 Dotfuscator 是 Visual Studio 自帶的混淆工具&#xff08;Dotfuscator Community Edition&#xff0c;簡稱 CE&#xff09;。它可以混淆 C# 類庫&#xff08;DLL&#xff09;或應用程序&#xff08;EXE&#xff09;&#xff0c…

線程同步與互斥(上)

上一篇&#xff1a;線程概念與控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我們學習了線程的控制及其相關概念之后&#…

[Linux系統編程]進程信號

進程信號 1. 信號入門1.1 信號基本概念1.2 技術應用角度的信號2. 信號的產生2.1 通過終端按鍵(如鍵盤)產生信號2.2 通過異常產生信號2.3 調用系統函數向進程發信號2.4 由軟件條件產生信號2.5 總結3. 阻塞信號3.1 信號其他相關常見概念3.2 內核中的信號表示3.3 sigset_t3.3.1 …

要素的選擇與轉出

1.要素選擇的三種方式 當要在已有的數據中選擇部分要素時&#xff0c;ArcMap提供了三種方式:按屬性選擇、位置選擇及按圖形選擇。 1)按屬性選擇 通過設置 SQL查詢表達式&#xff0c;用來選擇與選擇條件匹配的要素。 (1)單擊主菜單下【選擇】【按屬性選擇】&#xff0c;打開【按…