YAML第一章 基本概念及语法

简介

本文对YAML的基本概念及语法进行了详细的分析,尤其是对YAML的语法进行了详细的阐述,旨在希望通过本文能对YAML有一个基本的了解,能够书写YAML文档。

声明

本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。

如果您进行转载,请标明出处。

YAML学习笔记一 YAML基本概念及语法(http://www.liyubin.com/articles/2019/03/14/1552529532355.html)

YAML基本概念

1. YAML简介

YAML,是一个可读性高,用来表达资料序列的编程语言。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式。目YAML是”YAML Ain’t a Markup Language”(YAML不是一种置标语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。

YAML官方文档中给的定义很简单,即:“YAML Ain’t Markup Language” (abbreviated YAML) is a data serialization language designed to be human-friendly and work well with modern programming languages for common everyday tasks. This specification is both an introduction to the YAML language and the concepts supporting it; it is also a complete reference of the information needed to develop applications for processing YAML.

2. YAML VS XML,YAML VS Json,…

网上有很多关于这类的文章的描述,不过多介绍,有兴趣的可以自行搜索比较,看看各路大神对YAML的分析

3. YAML不足

YAML没有自己的数据类型的定义,而是使用实现语言的数据类型。一个YAML文件,在不同语言中解析后得到的数据类型可能会不同,由于其兼容性问题,不同语言间的数据流转不建议使用YAML。

YAML基本语法

1. YAML语法

  • 基本格式要求

    • YAML使用可打印的Unicode编码作为标准字符编码,可以使用UTF-8或者UTF-16
    • YAML对于大小写是敏感的
    • YAML文件使用.yaml做为后缀
    • YAML使用缩进代表层级关系,同时缩进只能使用空格,不能使用tab键(推荐:在各种语言中为了使用代码统一,可以在各编辑器中设置使用空格来替换Tab,一般使用4个空格),对于空格的数量没有特别的要求,但相同的层级在左对齐
  • 基本类型

    • 内置类型

      类型 表示方法 备注
      整数 !!int 可使用10进制,2进制,8进制,16进制表示
      浮点数 !!float
      布尔 !!bool 可以是True,true,tRue,False等,忽略大小写
      字符串 !!str 复杂的情况下可以文本块
      二进制 !!binary 也是字符串类型
      日期时间 !!timestamp 采用ISO8601格式
      空值 !!
      集合 !!set
      序列 !!seq ----
      键值表 !!map 键是唯一的
      键值列表 !!omap
      对象列表 !!pairs

      特别指出:对于二进制类型来说本质是上一个base64的文本块,如:

      picture: !!binary |R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmleECcgggoBADs=
      
    • 常量值

      表示单个的,不可再分的值,主要的结构有:整数,浮点数,字符串,NULL,日期,布尔,时间

      布尔型类型:

      值为true/false,完全忽略大小写
      isstudent: trUe
      

      浮点数:

      固定小数:
      pi: 3.1415926科学计数法表示:
      pi: 31415926e-8负无穷:
      minmin: -.inf无效数字:
      notnum: .NaN
      

      整型值:可以使用10进制、2进制、8进制、16进制表示

      10进制:
      intvalue: 1232进制:
      intvalue: 0b1010_10108进制:
      intvalue: 0o3416进制:
      intvalue: 0xFFFF
      

      字符串/文本块:

      strvalue: newline字符串类的值,也可以使用单引号或双引号,若字符串中包含有空格或者特殊字符,则必须使用单引号或者双引号,双引号与单引号还有不同,双引号不会对特殊字符转义,若单引号之中还有单引号,则必须连续使用两个单引号转义
      字符串可以拆成多行,每一行会被转成一个空格,对于多行字符串可以使用|保留换行符,也可以使用>折叠换行,使用+表示保留文字块末尾的换行,使用-表示删除字符串末尾的换行
      字符串也可以HTML标记strvalue: 'new\nline'
      使用单引号相当于{ strvalue: 'new\\nline' }strvalue: "new\nline"
      使用双引号相当于{ strvalue: 'new\nline' },双引号不会对特殊字符转义strvalue: newline
      字符串可以拆成多行,每一行会被转成一个空格,相当于{ strvalue: 'new line' }strvalue: |newline
      使用|来表示需要保留换行符,相当于{ strvalue: 'new\nline\n' }strvalue: >newline
      使用>折叠换行,相当于{ strvalue: 'new line\n' }strvalue: |+newline
      使用+表示保留末尾的换行,相当于{ strvalue: 'new\nline\n' }strvalue: |-newline
      使用-表示删除末尾的换行,相当于{ strvalue: 'new\nline' }strvalue: |<p style="color: red">newline</p>
      相当于{ strvalue: '<p style="color: red">\n  newline\n</p>\n' }
      

      日期类型:

      日期必须使用ISO 8601格式,即:yyyy-MM-dd
      date: 2019-03-13
      

      时间类型:

      时间使用ISO 8601格式,时间和日期之间使用T连接,使用+或者-代表时区
      datetime: 2019-03-13T20:49:33+08:00
      

      NULL类型:

      使用~表示null
      nullvalue: ~相当于{ nullvalue: null }
      
    • 键值表、映射、哈希、字典

      键值对的集合,使用冒号(: )代表,格式为key: value,需要注意的是冒号后面需要添加一个空格,如:

      Block style: !!mapClark : EvansBrian : IngersonOren  : Ben-Kiki
      Flow style: !!map { Clark: Evans, Brian: Ingerson, Oren: Ben-Kiki }相当于{ 'Block style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' },'Flow style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' } }

      当键是一个列表或者键值表时,需要使用问号(? )表示复杂的键,如:

      ? - blue- red- green
      : Color也可以使用流式表示
      ? [blue, reg, green]: Color相当于:{ 'blue,red,green': 'Color' }
    • 数组、序列、列表

      一组按次序排列的值,使用短横线(- )代表数组,格式为- value,需要注意的短横线后面需要添加一个空格,如:

      student:- jone- steven- bob
      

      数组可以使用复杂的类型,比如:

      classes:- id: 1001name: joneage: 12- id: 1002name: stevenage: 14-id: 1003name: bobage: 15
      

      数组中复杂的类型,也可以使用流式(flow)方式表示,如:

      classes: [{id: 1001, name: jone, age: 12},{id: 1002, name: steven, age: 14},{id: 1003, name: bob,age: 15}]
      
  • 注释

    YAML中使得#做为注释,从这个字符一直到行尾,都会被忽略

  • 文档开始与结束符

    使用三个短横线(—),表示一个文档的开始,一般情况下在同一个文件中有有多个时使用
    使用三个点号(…),表示一个文档的结束,一般情况下和—共同使用。尤其是对于网络传输或者流来说,作为明确的结束符号有利于软件的处理。

    比如:
    ```---
    id: 1001
    name: jone
    age: 12
    ...
    ---
    id: 1002
    name: steven
    age: 14
    ...```
    
  • 类型强制转换

    可以使用双感叹号(!!),表示需要进行类型转换,如:

    使用!!str将整型及bool型强制转成字符串string:- !!str 123456- !!str true

    具体的内置类型可以参看上述的类型描述中

  • 引用

    可以使用&符号来定义描点,可以使用*来引用定义的描点,可以使用<<来合并到当前数据中,如:

    defaults: &defaults
    adapter:  postgres
    host:     localhostdevelopment:database: myapp_development<<: *defaultstest:database: myapp_test<<: *defaults相当于defaults:adapter:  postgreshost:     localhostdevelopment:database: myapp_developmentadapter:  postgreshost:     localhosttest:database: myapp_testadapter:  postgreshost:     localhost
  • 指令符号

    在单一的文档中可以使用指导指令,一般情况下定义在文档的开始早于开始符号(—),使用百分比符号(%),在YAML1.1中定义了两个指导指令:

    • %YAML 指导指令,用来识别文件的YAML版本号,放在文档的首行
    • %TAG 指导指令,被用在URI的字首标记,这个方法在标记节点的型态时相当有用

    TODO:有待进一步补充

  • 自定义类型或标识

    可以使用单个感叹号(!)表示自定义类型

    TODO:有待进一步补充

2. YAML各种语言的实现

YAML语言已经有了多种语言的实现,具体的参见YAML官网,此处将会重点介绍一下C#中YAML的实现。

章节

  • YAML学习笔记 总章
  • 第一章 YAML基本概念及语法
  • 第二章 YAML与Unity
  • 第三章 C#解析YAML

参考资料

  • YAML 技术研究
  • YAML官网
  • YAML Tutorial
  • YAML快速入门
  • YAML详解 是什么
  • 通过一篇YAML来学习YAML
  • YAML在线格式化校验工具

YAML第一章 基本概念及语法相关推荐

  1. The X New Developer’s Guide——第一章 基本概念

    第一章Xwindow概念 本章的目的在于介绍你需要的理解的基本Xwindow概念和技术.如果你已经掌握了这些概念,那么你已经准备好深入挖掘后续的章节了. 第一节 X服务器/客户端 Xwindow系统被 ...

  2. Intel汇编语言程序设计学习-第一章 基本概念

    第一章基本概念 1.1  简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...

  3. 概率复习 第一章 基本概念

    本文用于复习概率论的相关知识点,因为好久不接触了,忘了不少.这里捡起来,方便学习其他知识. 总目录 概率复习 第一章 基本概念 概率复习 第二章 随机变量及其分布 本章目录 事件的运算 交换律 结合律 ...

  4. SAS初级编程系列视频:第一章基本概念

    SAS初级编程系列视频:第一章基本概念 SAS初级编程系列视频: Chapter 1 Basic Concepts 本章内容 SAS程序的结构和组成部分 SAS程序处理步骤 SAS库和SAS文件类型 ...

  5. 【ES6 教程】第一章 新的ES6语法04—如何设置函数参数的默认值

    英文 | https://www.javascripttutorial.net 翻译 | 杨小爱 在本节教程中,我们将学习如何在 ES6 中处理 JavaScript 默认参数. TL;DR func ...

  6. 【ES6 教程】第一章 新的ES6语法03—使用const 关键字定义常量

    英文 | https://www.javascripttutorial.net 翻译 | 杨小爱 在本教程中,我们将学习如何使用 JavaScript const 关键字定义常量. JavaScrip ...

  7. 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 第一章 概念和工具(二)

    1.2   基础概念和术语(续) 内核模式和用户模式 l         内核模式和用户模式是处理器的概念,而不是操作系统的概念. l         用户代码运行在用户模式下,操作系统代码运行在内核 ...

  8. python编程基本语法元素_第一章:Python基本语法元素

    一.程序设计基本方法 1.计算机与程序设计 1.1   计算机的概念 计算机是根据指令操作数据的设备 具有以下两个特点: ①功能性:对数据的操作,表现为数据计算.输入输出结果和结果存储: ②可编程性: ...

  9. 第一章 TensorFlow基础——python语法(三)

    简明Python基础(三) 此为jupyter notebook导出文档,如果习惯jupyter界面可以下载文件 链接:https://pan.xunlei.com/s/VMn5shjbvhvIPMq ...

最新文章

  1. JConsole是什么
  2. 关于MySQL线程池,这也许是目前最全面的实用帖!
  3. python里面ca_Python SSL服务器提供中间CA证书
  4. 基于python的scrapy爬虫抓取京东商品信息
  5. map和vector的迭代器失效问题(某公司招聘笔试试题)
  6. 一种集各种优点于一身的技术面试方式--转
  7. 推荐一个Python终身学习者
  8. 干货:排名前16的Java工具类
  9. 求一元二次方程(信息学奥赛一本通-T1058)
  10. 前17名最喜欢的操作系统黑客(2017年名单)
  11. 【LeetCode每天一题】Permutations(排列组合)
  12. C++---内联函数与宏
  13. zookeeper 虚拟机搭建好后 外部链接不上_Ubuntu Server搭建Hyperledger Fabric 2.1学习环境...
  14. yaf mysql pdo 封装_PDO 操作数据库
  15. Kotlin基础(五)Kotlin的类型系统
  16. 3dmax渲染出图噪点原因及解决方法
  17. 在Markdown中绘制思维导图
  18. 偏最小二乘法的几种解释
  19. 主成分分析和因子分析的理论与速成应用丨R语言和SPSS比较案例
  20. redis集群模式--解决redis单点故障

热门文章

  1. PSpice 仿真混沌电路的相图的步骤
  2. 海思HI35xx语音识别方案
  3. PIC16F73-I/SO代理
  4. 什么是CSS特异性及其工作方式?
  5. 消控监控系统 服务器,实验室监控系统设计
  6. android调用相册和摄像头,Android8.3调用摄像头和相册
  7. 人工智能、机器人、编程啥关系?(科普)
  8. 多目标优化-Pareto遗传算法
  9. 支持右翼教科书的日本企业与个人全部名单
  10. app中jeDate日期控件的使用