YAML

YAML這種語言。YAML是"YAML Ain't a Markup Language"，但為了強調這種語言以資料為中心，而不是以標記語言為重點，而用反向縮略語重新命名。功能.YAML的語法和其他高階語言類似，並且可以簡單表達清單、散列表，純量等資料形態。它使用空白符號縮排和大量依賴外觀的特色，特別適合用來表達或編輯資料結構、各種設定檔、傾印除錯內容、檔案大綱的資料。由於YAML使用空白字元和分行來分隔資料，使得它特別適合用grep／Python／Perl／Ruby操作。其讓人最容易上手的特色是巧妙避開各種封閉符號，如：引號、各種括號等，這些符號在巢狀結構時會變得複雜而難以辨認。範例.簡單的檔案.資料結構可以用類似大綱的縮排方式呈現receipt: Oz-Ware Purchase Invoicedate: 2012-08-06customer:given: Dorothyfamily: Galeitems:- part_no: A4786descrip: Water Bucket (Filled)price: 1.47quantity: 4- part_no: E1628descrip: High Heeled "Ruby" Slipperssize: 8price: 133.7quantity: 1bill-to: &amp;id001street: |123 Tornado AlleySuite 16city: East Centervillestate: KSship-to: *id001specialDelivery: &gt;Follow the Yellow BrickRoad to the Emerald City.Pay no attention to theman behind the curtain.注意在YAML中，字串不一定要用雙引號標示。另外，在縮排中空白字元的數目並不是非常重要，只要相同階層的元素左側對齊就可以了。語言的構成元素.YAML的基本元件.YAML提供縮排／區塊以及內建兩種格式，來表示清單和雜湊表。以下展示幾種YAML的基本原件。清單.習慣上清單比較常用區塊格式表示，也就是用短槓+空白字元作為起始。--- # 最喜愛的電影- Casablanca- North by Northwest- Notorious另外還有一種內建格式。--- # 購物清單[milk, pumpkin pie, eggs, juice]關聯陣列.鍵值和資料由冒號及空白字元分開。區塊形式在大括號中使用逗號+空白字元分隔key: value對。--- # 區塊形式name: John Smithage: 33--- # 內建形式區塊的字元.再次強調，字串不需要包在引號之內。有兩種語法可以書寫多行文字。兩種語法在其特殊字元之後都必須接著換行。保留換行(Newlines preserved).data: | # 譯者注：這是一首著名的五行民謠(limerick)There once was a man from Darjeeling # 這裡曾有一個人來自大吉嶺Who got on a bus bound for Ealing # 他搭上一班往伊靈的公車It said on the door # 門上這麼說的"Please don't spit on the floor" # "請勿在地上吐痰"So he carefully spat on the ceiling # 所以他小心翼翼的吐在天花板上根據預設，每行開頭的縮排和行末空白會被去除，而不同的縮排會保留差異。摺疊換行(Newlines folded).data: &gt;Wrapped text # 摺疊的文字will be folded # 將會被收into a single # 進單一一個paragraph # 段落Blank lines denote # 空白的行代表paragraph breaks # 段落之間的區隔和保留換行不同的是，只有空白行才視為換行，原本的換行字元會被轉換成空白字元，而行首縮排會被去除。階層化的元素.於清單中使用雜湊表.- name: Mary Smithage: 27於雜湊表中使用清單.men: [John Smith, Bill Jones]women:- Mary Smith- Susan WilliamsYAML的進階元件.這部分算是一個後續的討論，在比較各種數資料列語言時，YAML最常被提到的特色有兩個：關係樹和資料形態。樹狀結構之間的互動參照.資料合併和參考.為了維持檔案的簡潔，並避免資料輸入的錯誤，YAML提供了節點參考合併只有雜湊表可以使用，可以將鍵值自錨點標記複製到指定的雜湊表中。當資料被instantiate合併和參考會被剖析器自動展開。- step: &amp;id001 # 定義錨點標籤 &amp;id001instrument: Lasik 2000pulseEnergy: 5.4pulseDuration: 12repetition: 1000spotSize: 1mm- step:«: *id001 # 合併鍵值：使用在錨點標籤定義的內容spotSize: 2mm # 覆寫"spotSize"鍵值- step:«: *id001 # 合併鍵值：使用在錨點標籤定義的內容pulseEnergy: 500.0 # 覆寫鍵值alert: &gt; # 加入其他鍵值warn patient ofaudible pop資料形態.由於自動判定資料形態的功能，嚴格型態。強迫轉型.YAML的自動判定資料形態是哪一種實體。但有時使用者會想要將資料強迫轉型成自定的某種型態。最常見的狀況是字串，有時候可能看起來像數字或布林值，這種時候可以使用雙引號，或是使用嚴格型態標籤。a: 123 # 整數b: "123" # 字串c: 123.0 # 浮點數d: !!float 123 # 浮點數，使用!!表達的嚴格型態e: !!str 123 # 字串，使用嚴格型態f: !!str Yes # 字串，使用嚴格型態g: Yes # 布林值"真"h: Yes we have No bananas # 字串其他特殊資料形態.除了一般的資料形態之外，使用者也可以使用一些較為進階的型態，但不保證可被每種解析器分析。使用時和強迫轉型類似，要在形態名稱之前加上兩個驚嘆號picture: !!binary |R0lGODdhDQAIAIAAAAAAANnZ2SwAAAAADQAIAAACF4SDGQar3xxbJ9p0qa7R0YxwzaFME1IAADs=使用者自行擴充的資料形態.許多YAML的實現允許使用者自訂資料形態。在將一個物件序列化時，這個方法還頗方便的。某些區域資料形態可能不存在預設的資料形態中，不過這種型態在特定的YAML應用程式中是有定義的。這種區域資料形態用驚嘆號表示。語法.在yaml.org及格式說明。下面的內容，是關於基本元件的摘要。YAML在使用逗號及冒號時，後面都必須接一個空白字元，所以可以在字串或數值中自由加入分隔符號而不需要使用引號。另外還有兩個特殊符號在YAML中被保留，有可能在未來的版本被使用--。與其他資料序列化格式比較.雖然YAML是參考JSON，XML和SDL等語言，不過跟這些語言比起來，YAML仍有自己的特色。JSON.JSON的語法是YAML1.2版的子集,，同時非常"接近" YAML1.0與1.1版的子集，因此大部分的JSON檔案都可以被YAML的剖析器剖析。這是因為JSON的語法結構和YAML的內建格式相同。雖然大範圍的分層也可以使用類似JSON的內建格式，不過YAML標準並不建議這樣使用，除非這樣編寫能讓檔案可讀性增加。YAML的許多擴充套件在JSON是找不到的，如：進階資料形態、關係錨點、字串不需要雙引號、對映資料形態會儲存鍵值的順序。XML和SDL.XML和SDL標籤概念，在YAML中是找不到的。"對於資料結構序列"是存在的。另外還有YAXML──用XML描述YAML的結構──可以讓XML Schema與XSLT轉換程式應用在YAML之上。況且，在一般使用的情況下，YAML豐富的定義型態之語法已經提供了足夠的方式，來辨認YAML檔案是否正確。縮排劃界.由於YAML的運作主要依賴大綱式的縮排來決定結構，這有效解決了界定符衝突的問題。YAML的資料形態不依賴引號之特點，使的YAML檔案可以利用區塊，輕易的插入各種其他型別檔案，如：XML、SDL、JSON，甚至插入另一篇YAML。example: &gt;HTML goes into YAML without modificationmessage: |"Three is always greater than two,even for large values of two"相反的，要將YAML置入XML或SDL中時，需要將所有空白字元和位勢符號轉換成實體語法；要將YAML置入JSON中，需要用引號框住，並轉換內部的所有引號。非階層式的資料模型.跟SDL、JSON等，每個子結點只能有單一一個父節點的階層式模型不同，YAML提供了一個簡單的關係體制，可以從樹狀結構的其他地方，重複相同的資料，而不必顯示那些冗餘的結構。這點和XML中的IDRef類似YAML剖析器在將YAML轉換成物件時，會自動將那些結構展開，所以程式在使用時並不會查覺到哪些資料是解碼自這種結構。XML則不會將這種結構展開。這種表示法可以增加程式的可讀性，並且，在那種『大部分引數維持和上次相同，只有少數改變』的設定檔及通訊協定中，可以減少資料輸入錯誤。一個例子是：『送貨地點』和『購買地點』在發票的紀錄中幾乎都是相同的資料。實際的考量.YAML是「行導向的」，因此，就算想由現有程式的混亂輸出，轉換成YAML格式，並保留大部分的原始檔案之外觀，也非常簡單。因為他不需要平衡封閉的標籤、括弧及引號，可以從很簡單的利用程式，從報表產生YAML。同樣，空格分隔可讓使用行導向的命令如：grep、Awk、perl、ruby，和Python，來應急性的過濾YAML檔案時更加方便。特別是與標記語言不同的，連續的YAML區塊導向-{}-往往是格式良好的YAML檔案本身。這使得很容易撰寫那種「在開始提取的具體記錄之前，不需要'讀取全部檔案內容'」的解析器。當處理一個單一靜態的，整個存在記憶體中的資料結構將很大，或為提取一個專案來重建的整個結構，代價相當昂貴的記錄檔，這種特性是相當方便的。值得討論的是，儘管它的縮排方式似乎複雜化了深度很大的巢狀層次， YAML將縮排視為一個單一的空白，這可能會取得比其他標記語言更好的壓縮比。此外，極深的縮排可以完全避免的是： (1)使用“內建格式”而無縮排；或 (2)使用關聯錨點展開階層以形成一個攤平的格式，使得YAML解析器能透明地重組成完整的資料結構。安全性.YAML是純粹用來表達資料的語言，所以內部不會存程式碼注射的可執行命令。這代表剖析器會相當安全的解析檔案，而不用擔心潛在與執行命令相關的安全漏洞。舉例來說，JSON是JavaScript的子集，因此可能有人想使用JavaScript本身的剖析器直接eval，不過這樣一來就造成許多程式碼注射的漏洞。雖然在所有資料序列語言中，安全解析本質上是可能的，但可執行性卻正是這樣一個惡名昭彰的缺陷；而YAML缺乏相關的命令語言，可能是一個相對安全的利益。資料處理和呈現.XML和YAML規範提供非常不同的"邏輯"模型來進行資料結點的展現、處理及儲存。實作與函式庫.移植性.簡單的YAML檔案不需要完整的YAML剖析器，便可以被正規表示式解析。許多常用的程式語言──純用某個語言，讓函式庫具有可攜性──都有的YAML的產生器和剖析器。當效能比較重要時，也有許多和C語言繫結的函式庫可使用。其他函式庫.下面幾種程式語言都有與YAML相關的函式庫:參看.其他標記語言：