YAML基础语言深度解析

news2024/9/25 23:11:26

引言

     YAML(YAML Ain't Markup Language,即YAML不是一种标记语言)是一种直观、易于阅读的数据序列化格式,常用于配置文件、数据交换和程序间的通信。其设计目标是易于人类阅读和编写,同时也便于机器解析和生成。在本文中,我们将深入探索YAML的基本语法规则,从使用缩进表示层级关系、空格与Tab的严格区分、列表与字典的区分等几个方面进行详细讲解,力求条理清晰、结构分明。

一、YAML基础概览

1.1 YAML的起源与特点

YAML起源于2001年,由Clarke Ingram在O'Reilly Media的一次研讨会上首次提出。它的设计理念是简洁、直观且易于人类理解,同时保持机器解析的高效性。YAML的主要特点包括:

  • 可读性高:通过简单的语法规则,使得数据内容易于人类阅读和编写。
  • 扩展性强:支持多种数据类型,如字符串、整数、浮点数、布尔值、列表、字典等。
  • 灵活性好:可以轻松地与多种编程语言集成,进行数据交换和序列化。
  • 简洁性:去除不必要的标记和复杂结构,使得文件内容更加简洁明了。
1.2 YAML的应用场景

YAML因其独特的优势,在多个领域得到了广泛应用,包括但不限于:

  • 配置文件:作为软件或应用的配置文件,提供灵活的配置选项。
  • 数据交换:在不同系统或程序间交换数据,确保数据的准确性和一致性。
  • 自动化脚本:编写自动化脚本时,使用YAML作为输入或输出格式,简化脚本的编写和维护。

二、YAML的语法规则

2.1 使用缩进表示层级关系

YAML通过缩进来表示数据的层级关系,这是其语法规则的核心之一。在YAML文件中,左侧对齐的数据表示它们处于同一层级,而缩进则用于表示数据的子层级。

示例

person:  
  name: John Doe  
  age: 30  
  address:  
    street: 123 Main St  
    city: Anytown  
    zip: 12345

 在上述示例中,person 是一个字典(或称为映射),它包含了三个键值对:nameage 和 address。其中,address 又是一个字典,包含了三个子键值对:streetcity 和 zip。通过缩进,我们可以清晰地看出这些数

2.2 缩进必须使用空格,不可使用Tab

YAML对缩进有着严格的要求,即必须使用空格来进行缩进,而不能使用Tab键。这是因为不同的文本编辑器和查看器可能对Tab的解析不一致,从而导致YAML文件的解析错误。

错误示例(使用Tab进行缩进):

# 假设这里使用了Tab进行缩进  
person:  
	name: John Doe  
	age: 30  
	address:  
		street: 123 Main St  
		city: Anytown  
		zip: 12345

上述示例中的缩进使用了Tab键,这可能会导致YAML解析器无法正确解析文件,从而引发错误。

正确做法(使用空格进行缩进):

person:  
  name: John Doe  
  age: 30  
  address:  
    street: 123 Main St  
    city: Anytown  
    zip: 12345
2.3 列表与字典的区分

在YAML中,列表和字典是两种基本的数据结构,它们通过不同的语法规则进行区分。

  • 列表:以“-”开头,表示一系列有序的元素。列表中的元素可以是任何类型的数据,包括字符串、整数、浮点数、布尔值、其他列表或字典等。

示例

fruits:  
  - apple  
  - banana  
  - cherry

在上述示例中,fruits 是一个列表,包含了三个字符串元素:applebanana 和 cherry

  • 字典:不以“-”开头,由键值对组成,键和值之间用冒号(:)分隔,且冒号后面需要有一个空格。字典中的键通常是字符串,而值可以是任何类型的数据。
    person:  
      name: John Doe  
      age: 30

在上述示例中,person 是一个字典,包含了两个键值对:name 和 age。 

三、YAML的高级特性

3.1 锚点(Anchors)与别名(Aliases)

YAML中的锚点(Anchors)和别名(Aliases)允许你在文件中重用相同的数据结构,这对于减少重复和提高文件可维护性非常有帮助。

  • 锚点:通过在数据前添加&后跟一个锚名来定义。
  • 别名:通过*后跟一个已定义的锚名来引用之前定义的数据。

示例

defaults: &defaults  
  adapter: postgres  
  encoding: utf8  
  pool: 5  
  
development:  
  <<: *defaults  
  database: myapp_development  
  
test:  
  <<: *defaults  
  database: myapp_test

在这个示例中,我们定义了一个名为defaults的锚点,它包含了一些数据库连接的基本配置。然后,在developmenttest配置中,我们通过<<: *defaults引用了这个锚点,从而避免了重复书写相同的配置信息。

3.2 字符串表示

YAML提供了多种表示字符串的方式,包括单引号、双引号、未引用和块引用。

  • 未引用字符串:如果字符串不包含特殊字符(如:#%@!|>'"[]{},?-*/\ \t\n\r"\""#),则可以直接书写,不需要引号。
  • 单引号字符串:用单引号括起来的字符串会保留字符串中的所有特殊字符,包括换行符,但不会对特殊字符进行转义。
  • 双引号字符串:用双引号括起来的字符串可以包含特殊字符,并允许使用转义序列(如\n表示换行)。
  • 块引用字符串:用于表示多行文本,可以通过|>来标识。|保留换行符,而>则将所有换行符转换为空格。

示例

unquoted: Hello World  
single_quoted: 'Hello\nWorld'  # 输出包含换行符  
double_quoted: "Hello\nWorld"  # 输出Hello World(换行符被转义)  
block_literal: |  
  This is a block literal string.  
  It retains newlines and leading spaces.  
  
block_folded: >  
  This is a block folded string.  
  It folds newlines and leading spaces into a single space.
3.3 复杂数据类型

YAML支持多种复杂数据类型,如集合(sets)、映射(maps)、序列(sequences)等,使得它非常适合表示复杂的数据结构。

  • 映射:在YAML中,字典(或称为映射)是一种键值对的集合,键是唯一的,而值可以是任何类型的数据。
  • 序列:列表(或称为序列)是一种有序的元素集合,元素可以是任何类型的数据。
  • 集合:YAML本身没有直接支持集合(即不包含重复元素的列表)的语法,但可以通过一些技巧(如使用字典的键来模拟集合)来实现类似的功能。
3.4 注释

YAML中的注释以#开头,直到行尾。注释对于提高文件的可读性非常有帮助,但需要注意的是,注释不会被解析器处理,因此它们不会出现在解析后的数据结构中。

示例

# 这是一个注释  
person:  
  name: John Doe # 这是对name的注释  
  age: 30

四、YAML的最佳实践

4.1 保持文件整洁
  • 使用合理的缩进和空格,确保文件结构清晰。
  • 避免不必要的复杂嵌套,尽量保持数据结构简洁明了。
  • 使用注释来解释复杂的配置或逻辑,提高文件的可读性。
4.2 遵循一致性
  • 在整个文件中保持一致的缩进级别和空格使用。
  • 对于字符串表示,选择一种方式并在整个文件中保持一致。
  • 使用相同的命名规则和格式来命名键和值。
4.3 验证YAML文件的正确性
  • 使用YAML解析器或在线工具来验证YAML文件的语法正确性。
  • 在将YAML文件用于生产环境之前,进行充分的测试以确保配置的正确性

五、总结

       YAML以其简洁的语法、直观的结构和强大的功能,在配置文件、数据交换和程序间通信等领域得到了广泛应用。通过本文的详细讲解,我们深入了解了YAML的基本语法规则,包括使用缩进表示层级关系、空格与Tab的严格区分、列表与字典的区分等。同时,我们也探讨了YAML的高级特性,如锚点与别名、字符串的多种表示方式、复杂数据类型的支持以及注释的使用。

六、YAML的局限性与未来展望

       尽管YAML具有许多优点,但它也存在一些局限性。例如,YAML的语法规则相对严格,对缩进和空格的使用有严格要求,这可能导致一些新手在使用时遇到困惑。此外,YAML的解析器在不同编程语言中的实现可能存在细微差异,这可能会影响到YAML文件的跨平台兼容性。

然而,随着YAML的不断发展和完善,这些问题正在逐步得到解决。未来,我们可以期待YAML在以下几个方面取得更大的进步:

  1. 标准化与兼容性:随着YAML标准的不断推广和普及,不同编程语言中的YAML解析器将更加统一和兼容,从而减少因解析差异导致的问题。

  2. 性能优化:随着技术的不断进步,YAML解析器的性能将得到进一步提升,从而加快YAML文件的解析速度,提高程序的整体性能。

  3. 扩展性与灵活性:YAML将继续保持其扩展性和灵活性,支持更多类型的数据和更复杂的结构,以满足不同领域和场景的需求。

  4. 易用性提升:针对新手用户,可以开发更多易于上手的工具和文档,帮助他们快速掌握YAML的语法和用法,降低学习成本。

七、结语

       YAML作为一种优秀的数据序列化格式,以其简洁、直观和强大的特点赢得了众多开发者的青睐。通过本文的讲解,我们希望能够帮助读者更好地理解和使用YAML,提高开发效率和代码质量。同时,我们也期待YAML在未来能够不断发展和完善,为更多领域和场景提供更加便捷和高效的数据交换和配置管理解决方案。

       最后,我们鼓励读者在实际项目中积极尝试使用YAML,并分享自己的使用经验和心得。通过不断的实践和交流,我们可以共同推动YAML的发展和应用,为软件开发和数据管理领域带来更多的创新和进步。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

英伟达A100 GPU的核心数,Tesla系列

目录 GeForce RTX 什么意思 英伟达A100 GPU的核心数 A100概述 NVIDIA GPU GeForce系列(消费级) Quadro系列(专业级) Tesla系列(数据中心和AI) AMD GPU Radeon系列(消费级) 注意 GeForce RTX 什么意思 GeForce RTX是英伟达(NVIDIA)公司旗下的一个高端显卡系…

VS2019 新建项目里没有CUDA选项

问题 在Visual Studio 2019安装之前&#xff0c;先安装了CUDA Toolkit。在使用Visual Studio 2019创建新项目的时候&#xff0c;发现新建项目里没有CUDA的选项。 这时候有两种办法&#xff0c;一种是把CUDA Toolkit卸载重装&#xff0c;重装的时候&#xff0c;CUDA会自己在Visu…

LLM之本地部署GraphRAG(GLM-4+Xinference的embedding模型)(附带ollma部署方式)

前言 有空再写 微软开源的GraphRAG默认是使用openai的接口的&#xff08;GPT的接口那是要money的&#xff09;&#xff0c;于是就研究了如何使用开源模型本地部署。 源码地址&#xff1a;https://github.com/microsoft/graphrag 操作文档&#xff1a;https://microsoft.git…

springboot+vue+mybatis音乐网站的设计+PPT+论文+讲解+售后

听音乐看似是一件休闲娱乐的事情,但是如果你选择合适的音乐,多听一些有益的音乐,会有很多不一样的效果。音乐可以让身体放轻松,好的音乐可以纾解压力, 首先我们想到的是。可以舒缓心情。这一点是没错的&#xff0c;在一个人心情不好的时候&#xff0c;或者压抑的时候&#xff…

HDU1097——A hard puzzle,HDU1098——Ignatius‘s puzzle,HDU1099——Lottery

目录 HDU1097——A hard puzzle 题目描述 运行代码 代码思路 HDU1098——Ignatiuss puzzle 题目描述 ​编辑​编辑运行代码 代码思路 HDU1099——Lottery 题目描述 运行代码 代码思路 HDU1097——A hard puzzle 题目描述 Problem - 1097 运行代码 #include <…

openhasp入门--介绍

**OpenHASP** 是一个开源的智能家居控制器&#xff0c;使用ESP32&#xff0c;采用配置方式生成图形界面&#xff0c;免去写代码 1. 高度可定制性&#xff1a;用户可以根据自己的需求和偏好&#xff0c;灵活配置和定制各种自动化规则和场景。例如&#xff0c;您可以设置在特定时…

大模型基础之位置编码RoPE

文章目录 RoPE准备知识RoPE的推导RoPE的代码实现参考资料 RoPE RoPE(Rotary Position Embedding&#xff0c;旋转式位置编码)是一种配合Attention机制能达到“通过绝对位置编码的方式实现相对位置编码”的设计。在2021年2月由苏剑林提出&#xff0c;是现在的大模型最常用的位置…

二叉树的中序遍历 - 力扣(LeetCode)C语言

94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,…

【数据结构与算法】堆实现优先级队列

堆实现优先级队列 一.堆实现优先级队列的原理二.优先级队列结构体三.堆初始化四.入队五.出队六.销毁队列七.总结 一.堆实现优先级队列的原理 堆就是可以将最大值或者最小值,每次取出,那么刚好可以进行排序,而我们的优先级队列,就是对于优先级最高的先进行出队,也就相当于是排序…

空气净化器对去除宠物毛有效吗?小型猫毛空气净化器使用感受

作为一个养猫多年的猫奴&#xff0c;家里有两只可爱的小猫咪&#xff1a;小白和小花。虽然相处起来很开心&#xff0c;但也给生活带来了一些小麻烦。谁懂啊&#xff0c;我真的受够了&#xff0c;每天都在粘毛。猫窝的猫毛一周不清理就要堆成山&#xff0c;空气中也全是浮毛&…

JAVA线程中的安全性问题详解

多线程很难掌握&#xff0c;稍不注意&#xff0c;就容易使程序崩溃。我们以在路上开车为例&#xff1a; 在一个单向行驶的道路上&#xff0c;每辆汽车都遵守交通规则&#xff0c;这时候整体通行是正常的。『单向车道』意味着『一个线程』&#xff0c;『多辆车』意味着『多个 jo…

嵌入式学习---DAY18:shell脚本

shell脚本文件进程网络HtmlDb shell脚本是一系列shell命令的集合。 shell 命令解释器 shell编程&#xff1a;解释型语言、边翻译边执行、擅长文件处理,操作系统管理、开发效率高 cp 1 2、执、效率低、移植性好 C语言&#xff1a;编译型语言、先编译再执行、擅长数据计算…

【Linux】一篇总结!什么是重定向?输出重定向的作用是什么?什么又是追加重定向?

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;一篇总结&#xff01;什么是重定向&#xff1f;输出重定向的作用是什么&#xff1f;什么又是追加重定向&#xff1f; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Py…

绘制图层的图形全部都在geojson图层之下会被覆盖,同步graphic类型使用说明

### 绘制图层js const graphicLayer new mars3d.layer.GraphicLayer({zIndex: 1000000000000000000000000,hasEdit: false,isAutoEditing: false, // 绘制完成后是否自动激活编辑// addHeight: 1,allowDrillPick: false, }) 绘制方法js graphicLayer.startDraw({type: type,st…

一款免费的Windows 11/10系统常见问题修复工具

FixWin是一款功能强大的Windows系统修复工具&#xff0c;免费便携&#xff0c;无需安装即可使用。FixWin旨在帮助用户解决各种常见的Windows问题。它提供了多种修复选项和故障排除功能&#xff0c;适用于 Windows 11/10。 FixWin 主要功能&#xff1a; 系统文件检查器&#x…

深⼊理解指针(3)

1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5. 函数指针数组 6. 转移表 1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 ⼀般使⽤: char* 这两种方式都是把字符串中的首字符的地址赋值给pc。 在这串代码中 str1内容的地…

JVM高级特性

JVM高级特性 内存管理 jvm是自动内存管理的 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些…

基于STM32的智能仓储管理系统教程

目录 引言环境准备智能仓储管理系统基础代码实现&#xff1a;实现智能仓储管理系统 物品识别与追踪模块环境监控模块数据处理与存储模块用户界面与远程管理应用场景&#xff1a;仓储管理与优化常见问题与解决方案收尾与总结 引言 随着电子商务和物流行业的快速发展&#xff…

C++手撕简易vector

提前准备工作 由于vector跟string不同&#xff0c;vector是可以存储不同类型的变量的容器&#xff0c;因此实现类模板是肯定的 在原本的STL的vector容器中&#xff0c;主要成员变量有&#xff0c;start&#xff0c;finish&#xff0c;和 end_of_storage 所以 template<cl…

leetcode 2415.反转二叉树的奇数层

1.题目要求: 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &#xff0c;那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。 反转后&#xff0c;返回树的根节点。完美 二叉…