久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

YAML

來(lái)自站長(zhǎng)百科
跳轉(zhuǎn)至: 導(dǎo)航、? 搜索
YAML Logo

YAML,是一個(gè)可讀性高,用來(lái)表達(dá)資料序列的編程語(yǔ)言。YAML參考了其他多種語(yǔ)言,包括:XMLC語(yǔ)言、Python、Perl以及電子郵件格式。Clark Evans在2001年在首次發(fā)表了這種語(yǔ)言,另外Ingy d?t Net與Oren Ben-Kiki也是這語(yǔ)言的共同設(shè)計(jì)者。目前已經(jīng)有數(shù)種編程語(yǔ)言或腳本語(yǔ)言支援(或解析)這種語(yǔ)言。YAML是"YAML Ain't a Markup Language"(YAML不是一種置標(biāo)語(yǔ)言)的遞歸縮寫。在開發(fā)的這種語(yǔ)言時(shí),YAML 的意思其實(shí)是:"Yet Another Markup Language"(仍是一種置標(biāo)語(yǔ)言),但為了強(qiáng)調(diào)這種語(yǔ)言以數(shù)據(jù)做為中心,而不是以置標(biāo)語(yǔ)言為重點(diǎn),而用返璞詞重新命名。

YAML的功能[ ]

YAML的語(yǔ)法和其他高階語(yǔ)言類似,并且可以簡(jiǎn)單表達(dá)清單、雜湊表,標(biāo)量等資料形態(tài)。它使用空白符號(hào)縮排和大量依賴外觀的特色,特別適合用來(lái)表達(dá)或編輯數(shù)據(jù)結(jié)構(gòu)、各種設(shè)定檔、傾印除錯(cuò)內(nèi)容、文件大綱(例如:許多電子郵件標(biāo)題格式和YAML非常接近)。盡管它比較適合用來(lái)表達(dá)階層式(hierarchical model)的數(shù)據(jù)結(jié)構(gòu),不過(guò)也有精致的語(yǔ)法可以表示關(guān)聯(lián)性(relational model)的資料。由于YAML使用空白字符和分行來(lái)分隔資料,使的他特別適合用grep/Python/Perl/Ruby操作。其讓人最容易上手的特色是巧妙避開各種封閉符號(hào),如:引號(hào)、各種括號(hào)等,這些符號(hào)在巢狀結(jié)構(gòu)時(shí)會(huì)變得復(fù)雜而難以辨認(rèn)。

YAML范例[ ]

數(shù)據(jù)結(jié)構(gòu)可以用類似大綱的縮排方式呈現(xiàn)

---
receipt:     Oz-Ware Purchase Invoice
date:        2007-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 
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.
...

注意在YAML中,字符串不一定要用雙引號(hào)標(biāo)示。另外,在縮排中空白字符的數(shù)目并不是非常重要,只要相同階層的元素左側(cè)對(duì)齊就可以了(不過(guò)不能使用TAB字符)。這個(gè)文件的的頂層由七個(gè)鍵值組成:其中一個(gè)鍵值"items",是個(gè)兩個(gè)元素構(gòu)成的陣列(或稱清單),這清單中的兩個(gè)元素同時(shí)也是包含了四個(gè)鍵值的雜湊表。文件中重復(fù)的部分用這個(gè)方法處理:使用錨點(diǎn)(&)和參考(*)標(biāo)簽將"bill-to"雜湊表的內(nèi)容復(fù)制到"ship-to"雜湊表。也可以在文件中加入選擇性的空行,以增加可讀性。在一個(gè)檔案中,可同時(shí)包含多個(gè)文件,并用"——"分隔。選擇性的符號(hào)"..."可以用來(lái)表示檔案結(jié)尾(在利用串流的通訊中,這非常有用,可以在不關(guān)閉串流的情況下,發(fā)送結(jié)束訊號(hào))。

YAML語(yǔ)言的構(gòu)成元素[ ]

  • YAML的基本元件

YAML提供縮排/區(qū)塊以及內(nèi)置(inline)兩種格式,來(lái)表示清單和雜湊表。以下展示幾種YAML的基本原件。

  • 清單(陣列)

習(xí)慣上清單比較常用區(qū)塊格式(block format)表示,也就是用短杠+空白字符作為起始。

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

另外還有一種內(nèi)置格式(inline format)可以選擇──用方括號(hào)圍住,并用逗號(hào)+空白區(qū)隔(類似JSON的語(yǔ)法)

--- # 購(gòu)物清單 [milk, pumpkin pie, eggs, juice]

  • 雜湊表

鍵值和資料由冒號(hào)及空白字符分開。

--- # 區(qū)塊形式
name: John Smith
age: 33
--- # 內(nèi)置形式
{name: John Smith, age: 33}
  • 區(qū)塊的字符

再次強(qiáng)調(diào),字串不需要包在引號(hào)之內(nèi)。保存新行(Newlines preserved)

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

根據(jù)設(shè)定,前方的引領(lǐng)空白符號(hào)(leading white space)必須排成條狀,以便和其他資料或是行為(如范例中的縮排)明顯區(qū)分。

  • 折疊新行(Newlines folded)
--- >
  Wrapped text         #摺疊的文字
  will be folded       #將會(huì)被收
  into a single        #進(jìn)單一一個(gè)
  paragraph            #段落
  
  Blank lines denote   #空白的行代表
  paragraph breaks     #段落之間的區(qū)隔

和保存新行不同的是,換行字元會(huì)被轉(zhuǎn)換成空白字符。而引領(lǐng)空白字符則會(huì)被自動(dòng)消去。

  • 階層化的元素

雜湊表中使用清單

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

清單中使用雜湊表

men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams
  • YAML的進(jìn)階元件

這部分算是一個(gè)后續(xù)的討論,在比較各種數(shù)資料列語(yǔ)言時(shí),YAML最常被提到的特色有兩個(gè):關(guān)系樹和資料形態(tài)。

樹狀結(jié)溝之間的交互參照

資料合并和參考

為了維持文件的簡(jiǎn)潔,并避免資料輸入的錯(cuò)誤,YAML提供了結(jié)點(diǎn)參考(*)和雜湊合并(<<)參考到其他結(jié)點(diǎn)標(biāo)簽的錨點(diǎn)標(biāo)記(&)。參考會(huì)將樹狀結(jié)構(gòu)加入錨點(diǎn)標(biāo)記的內(nèi)容,并可以在所有數(shù)據(jù)結(jié)構(gòu)中運(yùn)作(可以參考上面"ship-to"的范例)合并只有雜湊表可以使用,可以將鍵值自錨點(diǎn)標(biāo)記復(fù)制到指定的雜湊表中。

當(dāng)資料被instantiate合并和參考會(huì)被剖析器自動(dòng)展開。

#眼部雷射手術(shù)之標(biāo)準(zhǔn)程序
---
- step:  &id001                  #定義錨點(diǎn)標(biāo)籤 &id001
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm

- step:
     <<: *id001                  # 合併鍵值:使用在錨點(diǎn)標(biāo)籤定義的內(nèi)容
     spotSize:       2mm         # 覆寫"spotSize"鍵值

- step:
     <<: *id001                  # 合併鍵值:使用在錨點(diǎn)標(biāo)籤定義的內(nèi)容
     pulseEnergy:    500.0       # 覆寫鍵值
     alert: >                    # 加入其他鍵值
           warn patient of 
           audible pop
  • 資料形態(tài)

由于自動(dòng)判定資料形態(tài)的功能,嚴(yán)格型態(tài)(也就是使用者有宣告的資料形態(tài))很難在大部分的YAML文件中看到。資料型態(tài)可以被區(qū)分成三大類:原碼(core),定義(defined),使用者定義(user-defined)。原碼可以自動(dòng)被解析器分析(例如:浮點(diǎn)數(shù),整數(shù),字串,清單,映射,...)。有一些進(jìn)階的資料形態(tài)──例如位元資料──在YAML中有被“定義”,但不是每一種解析器都有支援。最后,YAML支援使用者自定的區(qū)域變量,包括:自訂的類別,結(jié)構(gòu)或基本型態(tài)(例如:四倍精度的浮點(diǎn)數(shù))。

  • 強(qiáng)迫轉(zhuǎn)型

YAML的自動(dòng)判定資料形態(tài)是哪一種實(shí)體。但有時(shí)使用者會(huì)想要將資料強(qiáng)迫轉(zhuǎn)型成自定的某種型態(tài)。最常見的狀況是字串,有時(shí)候可能看起來(lái)像數(shù)字或布林值,這種時(shí)候可以使用雙引號(hào),或是使用嚴(yán)格型態(tài)標(biāo)簽。

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

  • 其他特殊資料形態(tài)

除了一般的資料形態(tài)之外,使用者也可以使用一些較為進(jìn)階的型態(tài),但不保證可被每種解析器分析。使用時(shí)和強(qiáng)迫轉(zhuǎn)型類似,要在形態(tài)名稱之前加上兩個(gè)驚嘆號(hào)(!!)。有幾種重要的形態(tài)在本篇沒有討論,包括集合(sets),有序映照(ordered maps),時(shí)間郵戳(timestamps)以及十六進(jìn)制資料(hexadecimal)。下面這個(gè)范例則是位元資料(binary)

---
picture: !!binary |
 R0lGODlhDAAMAIQAAP//9/X
 17unp5WZmZgAAAOfn515eXv
 Pz7Y6OjuDg4J+fn5OTk6enp
 56enmleECcgggoBADs=mZmE
  • 使用者自行擴(kuò)充的資料形態(tài)

許多YAML的實(shí)現(xiàn)允許使用者自訂資料形態(tài)。在將一個(gè)物件序列化時(shí),這個(gè)方法還頗方便的。某些區(qū)域資料形態(tài)可能不存在默認(rèn)的資料形態(tài)中,不過(guò)這種型態(tài)在特定的YAML應(yīng)用程式中是有定義的。這種區(qū)域資料形態(tài)用驚嘆號(hào)(!)表示。

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

YAML語(yǔ)法[ ]

  • 在yaml.org(英文)可以找到輕巧而好用的小抄(亦是用YAML表示)及格式說(shuō)明。下面的內(nèi)容,是關(guān)于基本元件的摘要。
  • YAML使用可打印的Unicode字符,可使用UTF-8UTF-16。
  • 使用空白字符為文件縮排來(lái)表示結(jié)構(gòu);不過(guò)不能使用跳格字符(TAB)。
  • 注解由井字號(hào)( # )開始,可以出現(xiàn)在一行中的任何位置,而且范圍只有一行(也就是一般所謂的單行注解)
  • 每個(gè)清單成員以單行表示,并用短杠+空白( - )起始?;蚴褂梅嚼ㄌ?hào)( [ ] ),并用逗號(hào)+空白( , )分開成員。
  • 每個(gè)雜湊表的成員用冒號(hào)+空白( : )分開鍵值和內(nèi)容?;蚴褂么罄ㄌ?hào)( { } ),并用逗號(hào)+空白( , )分開。
  • 雜湊表的鍵值可以用問(wèn)號(hào) ( ? )起始,用來(lái)明確的表示多個(gè)詞匯組成的鍵值。
  • 字串平常并不使用引號(hào),但必要的時(shí)候可以用雙引號(hào) ( " )或單引號(hào) ( ' )框住。
  • 使用雙引號(hào)表示字串時(shí),可用倒斜線( \ )開始的跳脫字符(這跟C語(yǔ)言類似)表示特殊字符。
  • 區(qū)塊的字串用縮排和修飾詞(非必要)來(lái)和其他資料分隔,有新行保留(preserve)(使用符號(hào) | )或新行折疊(flod)(使用符號(hào) > )兩種方式。
  • 在單一檔案中,可用連續(xù)三個(gè)連字號(hào)(——)區(qū)分多個(gè)檔案。
  • 另外,還有選擇性的連續(xù)三個(gè)點(diǎn)號(hào)( ... )用來(lái)表示檔案結(jié)尾。
  • 重復(fù)的內(nèi)容可使從參考標(biāo)記星號(hào) ( * )復(fù)制到錨點(diǎn)標(biāo)記( & )。
  • 指定格式可以使用兩個(gè)驚嘆號(hào) ( !! ),后面接上名稱。
  • 檔案中的單一文件可以使用指導(dǎo)指令,使用方法是百分比符號(hào)( % )。有兩個(gè)指導(dǎo)指令在YAML1.1版中被定義:
  • %YAML 指導(dǎo)指令,用來(lái)識(shí)別文件的YAML版本。
  • %TAG 指導(dǎo)指令,被用在URI的字首標(biāo)記。這個(gè)方法在標(biāo)記節(jié)點(diǎn)的型態(tài)時(shí)相當(dāng)有用。
  • YAML再使用逗號(hào)及冒號(hào)時(shí),后面都必須接一個(gè)空白字符,所以可以再字串或數(shù)值中自由加入分隔符號(hào)(例如:5,280或http://www.wikipedia.org)而不需要使用引號(hào)。
  • 另外還有兩個(gè)特殊符號(hào)在YAML中被保留,有可能在未來(lái)的版本被使用--( @ )和( ` )。

與其他資料序列語(yǔ)言比較[ ]

  • JSON

JSON的語(yǔ)法是YAML1.2版的子集[5],,同時(shí)非常接近[6] YAML1.0與1.1版的子集,因此大部分的JSON文件都可以被YAML的剖析器剖析。這是因?yàn)镴SON的語(yǔ)法結(jié)構(gòu)和YAML的內(nèi)置格式相同。雖然大范圍的分層也可以使用類似JSON的內(nèi)置格式,不過(guò)這并YAML標(biāo)準(zhǔn)并不建議這樣使用,除非這樣編寫能讓文件可讀性增加。YAML的許多擴(kuò)展在JSON是找不到的,如:進(jìn)階資料形態(tài)、關(guān)系錨點(diǎn)、字串不需要雙引號(hào)、映射資料形態(tài)會(huì)儲(chǔ)存鍵值的順序。

  • XML和SDL

XML和SDL標(biāo)簽概念,在YAML中是不找不到的。對(duì)于數(shù)據(jù)結(jié)構(gòu)序列(盡管這是有爭(zhēng)議的),標(biāo)簽屬性的特色就是可以將資料及復(fù)雜資料附加資訊分離,并將各種原生數(shù)據(jù)結(jié)構(gòu)(如:雜湊表、陣列)用同一種語(yǔ)言表示。YAML則以資料的可擴(kuò)展性作為替代。(包括為了模擬物件的類別型態(tài))在YAML本身的規(guī)范中,并沒有類似XML的語(yǔ)言定義文件剛要(language-defined document schema descriptors)──例如驗(yàn)證自己本身的結(jié)構(gòu)是否正確的文件。不過(guò),YAML綱要描述語(yǔ)言(YAML schema descriptor language)是存在的。另外還有YAXML──用XML描述YAML的結(jié)構(gòu)──可以讓XML Schema與XSLT轉(zhuǎn)換程式應(yīng)用在YAML之上。況且,在一般使用的情況下,YAML豐富的定義型態(tài)之語(yǔ)法已經(jīng)提供了足夠的方式,來(lái)辨認(rèn)YAML文件是否正確。

  • 縮排劃界

由于YAML的運(yùn)作主要依賴大綱式的縮排來(lái)決定結(jié)構(gòu),這有效解決了界定符沖突(Delimiter collision)的問(wèn)題。YAML的資料形態(tài)不依賴引號(hào)之特點(diǎn),使的YAML文件可以利用區(qū)塊,輕易的插入各種其他類型文件,如:XML、SDL、JSON,甚至插入另一篇YAML。

---
example: >
        HTML goes into YAML without modification
message:  |
        <font name='times' size=10>
         <p><i>"Three is always greater than
         two, even for large values of two"</i>
         </p><p>    --Author Unknown    </p></font>
date: 2007-06-01

相反的,要將YAML置入XML或SDL中時(shí),需要將所有空白字符和位勢(shì)符號(hào)(potential sigils,如:<,>和&)轉(zhuǎn)換成實(shí)體語(yǔ)法;要將YAML置入JSON中,需要用引號(hào)框住,并轉(zhuǎn)換內(nèi)部的所有引號(hào)。

  • 非階層式的資料模型

跟SDL、JSON等,每個(gè)子結(jié)點(diǎn)只能有單一一個(gè)父節(jié)點(diǎn)的階層是模型不同,YAML提供了一個(gè)簡(jiǎn)單的關(guān)系體制,可以從樹狀結(jié)構(gòu)的其他地方,重復(fù)相同的資料,而不必顯示那些冗余的結(jié)構(gòu)。這點(diǎn)和XML中的IDRef類似YAML剖析器在將YAML轉(zhuǎn)換成物件時(shí),會(huì)自動(dòng)將那些參考資料的結(jié)構(gòu)展開,所以程式在使用時(shí)并不會(huì)查覺到哪些資料是解碼自這種結(jié)構(gòu)。XML則不會(huì)將這種結(jié)構(gòu)展開。這種表示法可以增加程式的可讀性,并且,在那種‘大部分參數(shù)維持和上次相同,只有少數(shù)改變’的設(shè)定檔及通訊協(xié)定中,可以減少數(shù)據(jù)輸入錯(cuò)誤。一個(gè)例子是:‘送貨地點(diǎn)’和‘購(gòu)買地點(diǎn)’在發(fā)票的紀(jì)錄中幾乎都是相同的資料。

  • 實(shí)際的考量

YAML是“行導(dǎo)向的”,因此,就算想由現(xiàn)有程序的混亂輸出,轉(zhuǎn)換成YAML格式,并保留大部分的原始文件之外觀,也非常簡(jiǎn)單。因?yàn)樗恍枰胶夥忾]的標(biāo)簽、括號(hào)及引號(hào),可以從很簡(jiǎn)單的利用程式,從報(bào)表產(chǎn)生YAML。同樣,空格分隔可讓使用行導(dǎo)向的命令如:grep、Awk、perl、ruby,和Python,來(lái)應(yīng)急性的過(guò)濾YAML文件時(shí)更加方便。

特別是與標(biāo)記語(yǔ)言不同的,連續(xù)的YAML區(qū)塊導(dǎo)向往往是格式良好的YAML文件本身。這使得很容易撰寫那種“在開始提取的具體記錄之前,不需要'讀取全部文件內(nèi)容'”的解析器(通常需要平衡起始和關(guān)閉標(biāo)簽、尋找引號(hào)和跳脫字符)。當(dāng)處理一個(gè)單一靜態(tài)的,整個(gè)存在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)將很大,或?yàn)樘崛∫粋€(gè)項(xiàng)目來(lái)重建的整個(gè)結(jié)構(gòu),代價(jià)相當(dāng)昂貴的記錄檔,這種特性是相當(dāng)方便的。

值得討論的是,盡管它的縮排方式似乎復(fù)雜化了深度很大的巢狀層次, YAML將縮排視為一個(gè)單一的空白,這可能會(huì)取得比其他標(biāo)記語(yǔ)言更好的壓縮比。此外,極深的縮排可以完全避免的是:

(1)使用“內(nèi)置格式”(即簡(jiǎn)稱類JSON格式)而無(wú)縮排;

(2)使用關(guān)聯(lián)錨點(diǎn)展開階層以形成一個(gè)攤平的格式,使得YAML解析器能透明地重組成完整的數(shù)據(jù)結(jié)構(gòu)。

  • 安全性

YAML是純粹用來(lái)表達(dá)資料的語(yǔ)言,所以內(nèi)部不會(huì)存代碼注射的可執(zhí)行命令。這代表剖析器會(huì)相當(dāng)(至少)安全的解析文件,而不用擔(dān)心潛在與執(zhí)行命令相關(guān)的安全漏洞。舉例來(lái)說(shuō),JSON是JavaScript的子集,使用JavaScript本身的剖析器是相當(dāng)誘人的,不過(guò)也造成許多代碼注射的漏洞。雖然在所有資料序列語(yǔ)言中,安全解析本質(zhì)上是可能的,但可執(zhí)行性卻正是這樣一個(gè)惡名昭彰的缺陷;而YAML缺乏相關(guān)的命令語(yǔ)言,可能是一個(gè)相對(duì)安全的利益。

  • 資料處理和呈現(xiàn)

XML和YAML規(guī)范提供非常不同的邏輯模型來(lái)進(jìn)行資料結(jié)點(diǎn)的展現(xiàn)、處理及儲(chǔ)存。

相關(guān)條目[ ]

參考來(lái)源[ ]