neslib.yaml是一個用於解析和發射YAML並構建YAML文檔和流的庫。
neslib.yaml在利比亞姆圖書館的頂部建立,並從事:
安裝:
> git clone --recursive https://github.com/neslib/Neslib.Yaml該庫僅取決於NESLIB存儲庫,該存儲庫包含在此存儲庫中。
對於除MacOS 32位以外的所有平台,沒有運行時依賴關係:LibyAML庫直接鏈接到可執行文件中。對於MacOS 32位,您需要將libyaml_mac32.dylib庫將其部署到遠程路徑ContentsMacOS 。
這是YAML的簡短介紹。有關更詳細的信息,請查看官方YAML網站或諸如此類的許多在線資源之一。
YAML(“ Yaml ain't Markup語言”的縮寫)是一種數據序列化語言。與許多其他類似的基於文本的語言(例如JSON和XML)不同,YAML的主要目標是人類可讀,也很容易被人類創造。這就是為什麼通常用於配置文件的原因。但是,它可用於各種數據,例如YAML規範中的示例:
invoice : 34843
date : 2001-01-23
bill-to : &id001
given : Chris
family : Dumars
address :
lines : |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to : *id001
product :
- sku : BL394D
quantity : 4
description : Basketball
price : 450.00
- sku : BL4438H
quantity : 1
description : Super Hoop
price : 2392.00
tax : 251.42
total : 4443.52
comments : >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338. YAML文檔是一個值樹,稱為節點(此庫中的TYamlNode )。有4種節點:
映射類似於Delphi詞典。映射是密鑰/值對的集合。上面示例文檔的根筆記是一個映射:它將密鑰invoice映射到值34843 ,並包含7個其他密鑰/值對(從date到comments )。鍵和值都可以是任何YAML類型,儘管您可能想堅持使用鍵的字符串。
映射可以用塊符號(如示例中)或流符號(使用捲曲括號{} )寫入。
使用塊符號時,YAML使用凹痕進行範圍。僅允許空間用於凹痕(不是標籤)。只要在同一級別上使用相同數量的空間,空間的數量就無關緊要。在示例中, bill-to鍵的值是另一個映射。該映射縮進以表明它屬於按bill-to密鑰。
序列就像Delphi數組或列表一樣。可以使用流符號(使用Square Brackets [] )編寫小序列。較大或複雜的序列通常用塊符號編寫,如示例: product密鑰的值是兩種產品(籃球和超級箍)的序列。序列中的每個項目都始於儀表板和空間。
在此示例中,序列中的每個產品都是4個鍵/值對的映射。
所有節點至少具有兩個屬性: Tag和Anchor 。標籤用於描述節點的語義類型。標籤並不常見,因此我將在此介紹中跳過它們。 neslib.yaml對標籤有全力支持。
可以使用錨來標記文檔中的節點。然後,您可以稍後使用別名參考此節點。
錨固式前綴( & )。在示例中, bill-to鍵的值具有稱為id001的錨點(anmpersand不是名稱的一部分)。稍後,在文檔中, ship-to使用別名引用了此錨點(星號隨後是錨名,例如*id001 )。這是一種說明運輸地址與帳單地址相同的方式。請注意,別名不複製引用值;它實際上只是指另一個節點。
錨必須在文檔引用之前出現在文檔中。他們的名字在文檔中不必是唯一的。如果以相同名稱聲明了新的錨,它將取代舊錨。
標量是最簡單的類型。所有不是映射,序列或別名的內容都是標量。實際上,標量只是字符串。上面示例中的所有鍵都是字符串標2001-01-23 ,但是很多值也是(例如34843和Chris )。
YAML 1.1規範(這是利比亞爾使用的)將所有這些標量視為字符串,即使它們是數字或日期,如本示例中。您可以使用標籤明確說明特定標量是特定類型的。
該庫中的TYamlNode記錄提供了ToInteger和ToDouble等方法(嘗試)轉換為Delphi類型,而不管可能附加到節點上的任何標籤。
標量可以用不同的“樣式”寫:
| )開頭。在上面的示例中, bill-to.address.lines值是字面意義。文字中的任何新線都保留了。comments密鑰一起使用。YAML還有很多,但這應該涵蓋許多用例。
該庫的主要切入點是IYamlDocument或IYamlStream接口。
YAML文件可以包含多個文檔。如果是這種情況,則應使用IYamlStream加載它。流只是文檔的集合(類型IYamlDocument )。
但是,在大多數情況下,YAML文件僅包含一個文檔,並且從IYamlDocument開始更容易。加載文檔很容易:
var
Doc: IYamlDocument;
begin
Doc := TYamlDocument.Load( ' invoice.yaml ' );
end ;您可以從文件或流中加載,也可以使用TYamlDocument.Parse方法解析yaml文本。
現在,您可以使用IYamlDocument.Root屬性來檢查文檔。此屬性為TYamlNode類型,這是所有文檔的構建塊。
Tyamlnode的實現是使其輕巧的記錄。所有節點都是文檔的“所有者”。這使內存管理完全自動:一旦文檔超出範圍,其所有節點將自動釋放。這確實意味著,儘管文檔範圍不足之後,您不應該“堅持”到節點。這樣做會導致不確定的行為或違規行為。
例如,要在上面的示例中訪問第一個產品的price ,您可以使用以下代碼:
Price := Doc.Root.Values[ ' product ' ].Nodes[ 0 ].Values[ ' price ' ].ToDouble;您使用Values屬性在映射中通過鍵訪問值。同樣, Nodes屬性用於按序列中的索引訪問值,並且可以使用其中一種ToXXX方法將標量值轉換為Delphi DataType。
要檢查節點的類型,您可以使用NodeType屬性或IsXXX屬性之一( IsMapping , IsScalar等)。
您還可以從頭開始創建YAML文檔,並將其保存到文件或將其轉換為YAML。要創建YAML文檔,請根據所需的根節點的類型使用TYamlDocument.CreateXXX方法之一。如果要重建示例文檔,則從映射開始並致電:
Doc := TYamlDocument.CreateMapping;然後,您可以開始添加鍵/值對:
Doc.Root.AddOrSetValue( ' invoice ' , 34843 );
Doc.Root.AddOrSetValue( ' date ' , ' 2001-01-23 ' ); AddOrSetValue方法用於將密鑰/值對添加到映射。如果節點不是映射,則會提出EInvalidOperation異常。
要添加非量表值,請使用其他AddOrSetXXX方法之一:
var
Products: TYamlNode;
begin
Products := Doc.Root.AddOrSetSequence( ' product ' );
end ;這為關鍵product添加了映射的序列。然後,您可以使用AddXXX方法之一將值添加到序列中。同樣,如果節點不是序列,則會提高EInvalidOperation異常。在示例中,我們需要在此序列中添加另一個映射:
var
Product: TYamlNode;
begin
Product := Products.AddMapping;
Product.AddOrSetValue( ' sku ' , ' BL394D ' );
Product.AddOrSetValue( ' quantity ' , 4 );
// etc...
end ;構建文檔後,您可以使用Save方法將其保存到文件或流中,或使用ToYaml方法將其轉換為YAML:
var
Yaml: String;
begin
Yaml := Doc.ToYaml;
end ;您可以將可選的TYamlOutputSettings記錄傳遞給自定義YAML格式。
neslib.yaml比上述要多。有關更多詳細信息,您可以查看文檔良好的Neslib.Yaml.pas源文件。可以在單元測試中找到其他用法樣本,尤其是在Tests.Neslib.Yaml.Sample.pas中。
NESLIB.YAML獲得了根據簡化的BSD許可證的許可。
有關詳細信息,請參見License.txt。