功能[编辑]

YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。[4]它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。尽管它比较适合用来表达层次结构式(hierarchical model)的数据结构,不过也有精致的语法可以表示关系性(relational model)的数据。[5]由于YAML使用空白字符和分行来分隔数据,使得它特别适合用grep/Python/Perl/Ruby操作。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认。

示例[编辑]

简单的文件[编辑]

数据结构可以用类似大纲的缩进方式呈现

---
receipt:     Oz-Ware Purchase Invoice
date:        2012-08-06
customer:given:   Dorothyfamily:  Galeitems:- part_no:   A4786descrip:   Water Bucket (Filled)price:     1.47quantity:  4- part_no:   E1628descrip:   High Heeled "Ruby" Slipperssize:      8price:     133.7quantity:  1bill-to:  &id001street: | 123 Tornado AlleySuite 16city:   East Centervillestate:  KSship-to:  *id001   specialDelivery:  >Follow the Yellow BrickRoad to the Emerald City.Pay no attention to theman behind the curtain.
...

注意在YAML中,字符串不一定要用双引号标示。另外,在缩进中空白字符的数目并不是非常重要,只要相同层次结构的元素左侧对齐就可以了(不过不能使用TAB字符)。这个文件的的顶层由七个键值组成:其中一个键值"items",是个两个元素构成的数组(或称清单),这清单中的两个元素同时也是包含了四个键值的散列表。文件中重复的部分用这个方法处理:使用锚点(&)和引用(*)标签将"bill-to"散列表的内容复制到"ship-to"散列表。也可以在文件中加入选择性的空行,以增加可读性。在一个文件中,可同时包含多个文件,并用"---"分隔。选择性的符号"..."可以用来表示文件结尾(在利用流的通信中,这非常有用,可以在不关闭流的情况下,发送结束信号)。

语言的构成元素[编辑]

YAML的基本组件[编辑]

YAML提供缩进/区块以及内置(inline)两种格式,来表示清单和散列表。以下展示几种YAML的基本原件。

清单(数组)[编辑]

习惯上清单比较常用区块格式(block format)表示,也就是用短杠+空白字符作为起始。

 --- # 最喜愛的電影- Casablanca- North by Northwest- Notorious

另外还有一种内置格式(inline format)可以选择──用方括号围住,并用逗号+空白区隔(类似JSON的语法)。[6]

 --- # 購物清單 [milk, pumpkin pie, eggs, juice]

散列表[编辑]

键值和数据由冒号及空白字符分开。区块形式(常使用与YAML数据文档中)使用缩进和换行符分隔key: value对。内置形式(常使用与YAML数据流中)在大括号中使用逗号+空白字符分隔key: value对。

 --- # 區塊形式name: John Smithage: 33--- # 內置形式{name: John Smith, age: 33}

区块的字符[编辑]

再次强调,字符串不需要包在引号之内。有两种方法书写多行文字(multi-line strings),一种可以保存新行(使用|字符),另一种可以折叠新行(使用>字符)。

保存新行(Newlines preserved)[编辑]

data: |                                     # 譯者注:這是一首著名的五行民謠(limerick)There once was a man from Darjeeling     # 這裡曾有一個人來自大吉嶺Who got on a bus bound for Ealing        # 他搭上一班往伊靈的公車It said on the door                  # 門上這麼說的"Please don't spit on the floor"     # "請勿在地上吐痰"So he carefully spat on the ceiling      # 所以他小心翼翼的吐在天花板上

根据设置,前方的引领空白符号(leading white space)必须排成条状,以便和其他数据或是行为(如示例中的缩进)明显区分。

折叠新行(Newlines folded)[编辑]

data: >Wrapped text         # 摺疊的文字will be folded       # 將會被收into a single        # 進單一一個paragraph            # 段落Blank lines denote   # 空白的行代表paragraph breaks     # 段落之間的區隔

和保存新行不同的是,换行字符会被转换成空白字符。而引领空白字符则会被自动消去。

层次结构化的元素[编辑]

于清单中使用散列表[编辑]

- {name: John Smith, age: 33}
- name: Mary Smithage: 27

于散列表中使用清单[编辑]

men: [John Smith, Bill Jones]
women:- Mary Smith- Susan Williams

YAML的高级组件[编辑]

这部分算是一个后续的讨论,在比较各种数数据列语言时,YAML最常被提到的特色有两个:关系树和数据形态。

树状结构之间的交互引用[编辑]

数据合并和参考[编辑]

为了维持文件的简洁,并避免数据输入的错误,YAML提供了结点参考(*)和散列合并(<<)参考到其他结点标签的锚点标记(&)。参考会将树状结构加入锚点标记的内容,并可以在所有数据结构中运作(可以参考上面"ship-to"的示例)合并只有散列表可以使用,可以将键值自锚点标记复制到指定的散列表中。

当数据被instantiate合并和参考会被剖析器自动展开。

#眼部雷射手術之標準程序
---
- step:  &id001                  # 定義錨點標籤 &id001instrument:      Lasik 2000pulseEnergy:     5.4pulseDuration:   12repetition:      1000spotSize:        1mm- step:<<: *id001                  # 合併鍵值:使用在錨點標籤定義的內容spotSize:       2mm         # 覆寫"spotSize"鍵值- step:<<: *id001                  # 合併鍵值:使用在錨點標籤定義的內容pulseEnergy:    500.0       # 覆寫鍵值alert: >                    # 加入其他鍵值warn patient of audible pop

数据形态[编辑]

由于自动判定数据形态的功能,严格类型(也就是用户有宣告的数据形态)很难在大部分的YAML文件中看到。数据类型可以被区分成三大类:原码(core),定义(defined),用户定义(user-defined)。原码可以自动被解析器分析(例如:浮点数,整数,字符串,清单,映射,...)。有一些高级的数据形态──例如比特数据──在YAML中有被“定义”,但不是每一种解析器都有支持。最后,YAML支持用户自定的区域变量,包括:自定义的类别,结构或基本类型(例如:四倍精度的浮点数)。

强制转型[编辑]

YAML的自动判定数据形态是哪一种实体。但有时用户会想要将数据强制转型成自定的某种类型。最常见的状况是字符串,有时候可能看起来像数字或布尔值,这种时候可以使用双引号,或是使用严格类型标签。

---
a: 123                     # 整數
b: "123"                   # 字串(使用雙括號)
c: 123.0                   # 浮點數
d: !!float 123             # 浮點數,使用!!表達的嚴格型態
e: !!str 123               # 字串,使用嚴格型態
f: !!str Yes               # 字串,使用嚴格型態
g: Yes                     # 布林值"真"
h: Yes we have No bananas  # 字串(包含"Yes"和"No")

其他特殊数据形态[编辑]

除了一般的数据形态之外,用户也可以使用一些较为高级的类型,但不保证可被每种解析器分析。使用时和强制转型类似,要在形态名称之前加上两个惊叹号(!!)。有几种重要的形态在本篇没有讨论,包括集合(sets),有序映照(ordered maps),时间戳记(timestamps)以及十六进制数据(hexadecimal)。下面这个示例则是比特数据(binary)

---
picture: !!binary |R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmleECcgggoBADs=mZmE

用户自行扩展的数据形态[编辑]

许多YAML的实现允许用户自定义数据形态。在将一个对象序列化时,这个方法还颇方便的。某些区域数据形态可能不存在默认的数据形态中,不过这种类型在特定的YAML应用程序中是有定义的。这种区域数据形态用惊叹号( ! )表示。

---
myObject:  !myClass { name: Joe, age: 15}

语法[编辑]

在yaml.org(英文)可以找到轻巧而好用的小抄(亦是用YAML表示)及格式说明。下面的内容,是关于基本组件的摘要。

  • YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
  • 使用空白字符为文件缩进来表示结构;不过不能使用跳格字符(TAB)。
  • 注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
  • 每个清单成员以单行表示,并用短杠+空白( -   )起始。或使用方括号( [ ] ),并用逗号+空白( ,   )分开成员。
  • 每个散列表的成员用冒号+空白( :   )分开键值和内容。或使用大括号( {   } ),并用逗号+空白( ,   )分开。
    • 散列表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。
  • 字符串平常并不使用引号,但必要的时候可以用双引号 ( " )或单引号 ( ' )框住。
    • 使用双引号表示字符串时,可用倒斜线( \ )开始的转义字符(这跟C语言类似)表示特殊字符。
  • 区块的字符串用缩进和修饰符(非必要)来和其他数据分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
  • 在单一文件中,可用连续三个连字号(---)区分多个文件。
    • 另外,还有选择性的连续三个点号( ... )用来表示文件结尾。
  • 重复的内容可使从参考标记星号 ( * )复制到锚点标记( & )。
  • 指定格式可以使用两个惊叹号 ( !! ),后面接上名称。
  • 文件中的单一文件可以使用指导指令,使用方法是百分比符号( % )。有两个指导指令在YAML1.1版中被定义:
    • %YAML 指导指令,用来识别文件的YAML版本。
    • %TAG 指导指令,被用在URI的前缀标记。这个方法在标记节点的类型时相当有用。

YAML在使用逗号及冒号时,后面都必须接一个空白字符,所以可以在字符串或数值中自由加入分隔符号(例如:5,280或http://www.wikipedia.org)而不需要使用引号。

另外还有两个特殊符号在YAML中被保留,有可能在未来的版本被使用--( @ )和( ` )。

------------------------------------------------------------------------

来源:维基百科

链接:https://zh.wikipedia.org/wiki/YAML

YAML——基本语法相关推荐

  1. python测试系列教程 —— YAML配置文件语法教程

    全栈工程师开发手册 (作者:栾鹏) python教程全解 YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据 ...

  2. yaml/yml语法

    spring官方推荐使用application.yaml代替application.properties,因为yaml更加强大 properties语法:key=value ,例如 server.po ...

  3. symfony入门学习资料之十:YAML——基本语法

    symfony入门学习资料之十:YAML--基本语法 本节的学习,继续介绍YAML的语法,进一步深入的学习.在symfony框架中,yml格式的文件用的非常普遍,所以在本系列的学习中,要多花些篇幅进行 ...

  4. Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )

    Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...

  5. yml和yaml配置文件语法

    server: port: 8081 # k = v # 对空格的要求十分高! # 注入到配置类中! name: kuang # 对象 student: name: GCF age: 18 # 行内写 ...

  6. Kubenetes — YAML 基本语法

    目录 文章目录 目录 YAML Boolean String 对象 List & Hash 对象 YAML 以 --- 开始,以 ... 结尾. 同一级别的成员(e.g. List 元素)使用 ...

  7. helm 的 values.yaml 配置语法说明

    # 在values.yaml文件中定义的值通过 Values 对象传递到templates下的YAML模板清单中# 下例在YAML模板清单中通常最左侧的点 . 表示全局作用域 (引用全局对象) 而中间 ...

  8. 【spring boot2】第2篇:配置文件YAML语法

    YAML基本语法 使用缩进表示层级关系 缩进时不允许使用 tab 键,只允许使用空格 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 大小写敏感 语法参考文档 YAML支持的数据结构 对象(属性 ...

  9. 轻松掌握开发必会的docker套路-yaml语法与docker compose.yml

    我们编程的时候常常需要定义配置文件,配置文件的格式也多种多样,有用php的数组格式的,有xml格式的,也有json格式的. 由于docker compose使用的配置文件是docker-compose ...

最新文章

  1. 每天五分钟linux(8)-cp
  2. POJ1038 Bugs Integrated, Inc.
  3. 超大规模数据中心容量在四年内翻了一番,中国占比15%
  4. 蒸汽机器人q和锤石q_英雄联盟:圣杯锤石的启发,辅助的作用是否应该更倾向多元化?...
  5. python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?
  6. 解决python3缺少zlib的问题
  7. linux-基本开发环境搭建
  8. golang | windows平台golang环境搭建(过坑之后)
  9. (转)javascrit中的uriencode
  10. MySQL 表分区功能详解
  11. c++ idea 插件_IDEA的基本使用:让你的IDEA有飞一般的感觉
  12. 时间管理:战略时间块,缓冲时间块,逃离时间块
  13. Ajax实现--javascript
  14. SPSS 百度网盘免费下载
  15. 菜鸟的数学建模之路(五):Logistic模型
  16. matlab语法归纳
  17. 范数和条件数(Norms and Condition Numbers)
  18. 2018版本及2017版本的IntelliJ IDEA破解步骤,非lanyu,到2099年
  19. EXT151(QRC)安装步骤
  20. 信号与系统学习笔记 第三章

热门文章

  1. 网络教育计算机 判断,重庆网络教育计算机应用基础练习题(3)
  2. python期末试题汇总
  3. 马克一下 Michael Moore
  4. linux so sndbuf大小,了解set / getsockopt SO_SNDBUF大小加倍
  5. bga焊盘怎么做_BGA焊盘的设计
  6. centos 安装迅搜
  7. CCF计算机软件能力认证试题练习:201612-2 工资计算
  8. GNN GCN和GAT
  9. 服务器显示器不亮,液晶显示器不亮的原因及维修方法简介【图解】
  10. php主要技术指标,液晶显示器的主要技术指标不包括什么