YAML基础学习

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

Search

    Table of Contents