YAML简介
YAML(Yet Another Markup Language),一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。它参考了其它多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。
由于YAML使用空白字符和分行来分隔资料,使得它特别适合用 grep、Python、Perl、Ruby 操作。
适用场景
脚本语言
由于实现简单,解析成本很低,YAML 特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript,除了Java,其他都是脚本语言。
序列化
YAML 比较适合做序列化。因为它是宿主语言数据类型直转的。
配置文件
YAML 做配置文件也不错。写 YAML 要比写 XML 快得多(无需关注标签或引号),并且比 INI 文档功能更强。 由于兼容性问题,不同语言间的数据流转建议不要用 YAML。
语言比较
- 和 XML 相比,YAML 具有以下的优势
- 可读性好
- 和脚本语言的交互性好
- 使用实现语言的数据类型
- 可以基于流来处理
- 表达能力强,扩展性好
- XML 解析效率比较低,不过支持自定义的数据类型
更多的内容及规范参见http://www.yaml.org。
YAML语法
YAML 使用可打印的 Unicode 字符,可使用 UTF-8 和 UTF-16 编码。 使用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目,但是同层元素一定左对齐,即前面空格数目相同(不能使用 Tab,各个系统 Tab对应的 Space 数目可能不同,导致层次混乱) ‘#’表示注释,只能单行注释,从#开始处到行尾 破折号后面跟一个空格(a dash and space)表示列表 用冒号和空格表示键值对 key: value 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
范例
---
receipt: Oz-Ware Purchase Invoice
date:2012-08-06
customer:
given: Dorothy
family: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
size: 8
price: 133.7
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Centerville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
...
列表
列表中的所有成员都开始于相同的缩进级别, 并且使用一个 “- “ 作为开头(一个横杠和一个空格):
例1:
---
# 最喜爱AV女星
- 京香
- 波多野结衣
- 苍井空
例2:
---
# 一个美味水果的列表
- Apple
- Orange
- Strawberry
- Mango 另外还有一种内置格式(inline format)可以选择──用方括号围住,并用逗号+空白区隔(类似JSON的语法)
例1:
---
# 最喜爱AV女星
[京香,波多野结衣,苍井空]
例2:
---
# 一个美味水果的列表
[Apple,Orange,Strawberry,Mango] ## 字典 ## 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格):
---
# 一位职工的记录
name: Example Developer
job: Developer
skill: Elite
内置形式
—# 一位职工的记录
{name: Example Developer, job: Developer, skill: Elite}
Ansible并不是太多的使用这种格式, 但是你可以通过以下格式来指定一个布尔值(true/fase):
---
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
复合结构
例1:
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org 例2:
---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame