WIKI使用導(dǎo)航
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營(yíng)銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺(tái)
- WIKI程序與應(yīng)用
- 美國(guó)十大主機(jī)
YAML

YAML,是一個(gè)可讀性高,用來(lái)表達(dá)資料序列的編程語(yǔ)言。YAML參考了其他多種語(yǔ)言,包括:XML、C語(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-8或UTF-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ǔ)存。