Yet Another Markup Language(YAML)

Yet Another Markup Language

另一種標(biāo)記語言
特別適合用 grep、Python、Perl、Ruby 操作

多行縮進(jìn)

連續(xù)的項目通過減號 ‘ - ’ 來表示
Map結(jié)構(gòu)里面的 key/value 對用冒號 ‘ : ’ 來分隔

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

Tip

  • 字串不一定要用雙引號標(biāo)識
  • 在縮排中空白字符的數(shù)目并不是非常重要,只要相同階層的元素左側(cè)對齊就可以了(不過不能使用TAB字符)
  • 允許在文件中加入選擇性的空行,以增加可讀性
  • 在一個檔案中,可同時包含多個文件,并用---分隔
  • 選擇性的符號...可以用來表示檔案結(jié)尾(在利用串流的通訊中,這非常有用,可以在不關(guān)閉串流的情況下,發(fā)送結(jié)束訊號)

單行縮寫

  • 數(shù)組用 []
  • Hash用 {}
house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 235011 }

適用場景

  • 實(shí)現(xiàn)簡單,解析成本很低,YAML 特別適合在腳本語言中使用
  • YAML 比較適合做序列化,因為它是宿主語言數(shù)據(jù)類型直轉(zhuǎn)的
  • YAML 做配置文件也不錯

附加 YAML 庫到瀏覽器

<script src="/scripts/js-yaml.min.js" />
<script type="text/javascript">
var doc = jsyaml.load('greeting: hello\nname: world')
</script>

與 JSON

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

YAML 的許多擴(kuò)展在 JSON 是找不到的。
如:進(jìn)階資料形態(tài)、關(guān)系錨點(diǎn)、字串不需要雙引號、映射資料形態(tài)會儲存鍵值的順序

與 XML和SDL

XML 和 SDL 標(biāo)簽概念,在 YAML 中是找不到的

安全性

YAML 是純粹用來表達(dá)資料的語言,所以內(nèi)部不會存代碼注入的可執(zhí)行命令

語法

  • YAML 使用可打印的 Unicode 字符,可使用 UTF-8 或 UTF-16
  • 使用空白字符(不能使用Tab)分層,同層元素左側(cè)對齊
  • 單行注解由井字號( # )開始,可以出現(xiàn)在行中任何位置
  • 每個清單成員以單行表示,并用短杠+空白( - )起始
  • 每個雜湊表的成員用冒號+空白( : )分開鍵和值
  • 每個雜湊表的成員用冒號+空白(:)分開鍵和值
  • 字串一般不使用引號,但必要的時候可以用引號框住
  • 使用雙引號表示字串時,可用倒斜線(\)進(jìn)行特殊字符轉(zhuǎn)義
  • 區(qū)塊的字串用縮排和修飾詞(非必要)來和其他資料分隔,有新行保留(使用符號|)或新行折疊(使用符號>)兩種方式
  • 在單一檔案中,可用連續(xù)三個連字號(---)區(qū)分多個檔案
  • 可選擇性的連續(xù)三個點(diǎn)號(...)用來表示檔案結(jié)尾(在流式傳輸時非常有用,不需要關(guān)閉流即可知道到達(dá)結(jié)尾處)
  • 重復(fù)的內(nèi)容可使從參考標(biāo)記星號 (*)復(fù)制到錨點(diǎn)標(biāo)記(&
  • 指定格式可以使用兩個驚嘆號 ( !! ),后面接上名稱

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.

轉(zhuǎn)換成 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,是倆個元素構(gòu)成的清單,當(dāng)中的倆個元素分別是包含四個 HASH 鍵值對的
  • 使用錨點(diǎn) (&) 和參考 (*) 標(biāo)簽將 bill-to 復(fù)制到了 ship-to

XML和 YAML 語法格式

XML

<site>
    <name>yugo</name>
    <url>github.io/miyogurt</url>
</site>

YAML - Type 01

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

YAML - Type 02

# example
---
site: { name:yugo,url: github.io/miyogurt }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容