Yet Another Markup Language(YAML)

Yet Another Markup Language

另一种标记语言
特别适合用 grep、Python、Perl、Ruby 操作

多行缩进

连续的项目通过减号 ‘ - ’ 来表示
Map结构里面的 key/value 对用冒号 ‘ : ’ 来分隔

house:
  family:
    name: Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 610101

Tip

  • 字串不一定要用双引号标识
  • 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符)
  • 允许在文件中加入选择性的空行,以增加可读性
  • 在一个档案中,可同时包含多个文件,并用---分隔
  • 选择性的符号...可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)

单行缩写

  • 数组用 []
  • Hash用 {}
house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 235011 }

适用场景

  • 实现简单,解析成本很低,YAML 特别适合在脚本语言中使用
  • YAML 比较适合做序列化,因为它是宿主语言数据类型直转的
  • YAML 做配置文件也不错

附加 YAML 库到浏览器


与 JSON

JSON 的语法是 YAML1.2 版的子集, JSON 文件都可以被 YAML 的剖析器剖析

YAML 的许多扩展在 JSON 是找不到的。
如:进阶资料形态、关系锚点、字串不需要双引号、映射资料形态会储存键值的顺序

与 XML和SDL

XML 和 SDL 标签概念,在 YAML 中是找不到的

安全性

YAML 是纯粹用来表达资料的语言,所以内部不会存代码注入的可执行命令

语法

  • YAML 使用可打印的 Unicode 字符,可使用 UTF-8 或 UTF-16
  • 使用空白字符(不能使用Tab)分层,同层元素左侧对齐
  • 单行注解由井字号( # )开始,可以出现在行中任何位置
  • 每个清单成员以单行表示,并用短杠+空白( - )起始
  • 每个杂凑表的成员用冒号+空白( : )分开键和值
  • 每个杂凑表的成员用冒号+空白(:)分开键和值
  • 字串一般不使用引号,但必要的时候可以用引号框住
  • 使用双引号表示字串时,可用倒斜线(\)进行特殊字符转义
  • 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号|)或新行折叠(使用符号>)两种方式
  • 在单一档案中,可用连续三个连字号(---)区分多个档案
  • 可选择性的连续三个点号(...)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处)
  • 重复的内容可使从参考标记星号 (*)复制到锚点标记(&
  • 指定格式可以使用两个惊叹号 ( !! ),后面接上名称

YAML语法示例

receipt:     Oz-Ware Purchase Invoice
date:        2015-12-15
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 
      price:     100.27
      quantity:  1
bill-to:  &id001
    street: | 
            123 Tornado Alley
            Suite 16
    city:   East Westville
    state:  KS
ship-to:  *id001   
specialDelivery:  >
     Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the 
    man behind the curtain.

转换成 JSON 之后

{
    "receipt": "Oz-Ware Purchase Invoice",
    "date": "2015-12-15T00:00:00.000Z",
    "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",
            "price": 100.27,
            "quantity": 1
        }
    ],
    "bill-to": {
        "street": "123 Tornado Alley\nSuite 16\n",
        "city": "East Westville",
        "state": "KS"
    },
    "ship-to": {
        "street": "123 Tornado Alley\nSuite 16\n",
        "city": "East Westville",
        "state": "KS"
    },
    "specialDelivery": "Follow the Yellow Brick Road to the Emerald City. Pay no attention to the  man behind the curtain.\n"
}
  • 其中一个键值 items,是俩个元素构成的清单,当中的俩个元素分别是包含四个 HASH 键值对的
  • 使用锚点 (&) 和参考 (*) 标签将 bill-to 复制到了 ship-to

XML和 YAML 语法格式

XML


    yugo
    github.io/miyogurt

YAML - Type 01

# example
---
site:
    name: yugo
    url: github.io/miyogurt

YAML - Type 02

# example
---
site: { name:yugo,url: github.io/miyogurt }

你可能感兴趣的:(Yet Another Markup Language(YAML))