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サイトまたはこのような多くのオンラインリソースの1つをご覧ください。
YAML(「YAML AIN NOT MARKUP LANGUAGE」の略)は、データシリアル化言語です。他の多くの類似のテキストベースの言語(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タイプになる可能性がありますが、おそらくキー用の文字列に固執したいと思うでしょう。
マッピングは、ブロック表記(例のように)またはフロー表記(Curly Braces {}を使用)で記述できます。
ブロック表記を使用する場合、YAMLはスコープにインデントを使用します。インデントにはスペースのみが許可されます(タブではありません)。同じレベルのすべての値が同じ量のスペースを使用している限り、スペースの数は重要ではありません。この例では、 bill-toキーの値は別のマッピングです。このマッピングはbill-toキーに属していることを示すためにインデントされています。
シーケンスは、Delphiアレイまたはリストに似ています。小さなシーケンスは、フロー表記(四角い括弧[]を使用して)を使用して記述できます。通常、より大きなまたは複雑なシーケンスは、例のようにブロック表記で記述されます。 productキーの値は、2つの製品(バスケットボールとスーパーフープ)のシーケンスです。シーケンス内の各アイテムは、ダッシュとスペースから始まります。
この例では、シーケンス内の各製品は、4つのキー/値ペアのマッピングです。
すべてのノードには、 TagとAnchor少なくとも2つのプロパティがあります。タグは、ノードのセマンティックタイプを説明するために使用されます。タグはそれほど一般的ではないので、この紹介でそれらをスキップします。ただし、Neslib.yamlはタグを完全にサポートしています。
アンカーを使用して、ドキュメント内のノードをマークすることができます。その後、後でエイリアスを使用してこのノードを参照できます。
アンカーには、アンパサンド( & )が付いています。この例では、 bill-toの値にはid001と呼ばれるアンカーがあります(Ampersandは名前の一部ではありません)。ドキュメントの後半では、 ship-toキーはエイリアスを使用してこのアンカーを参照します(アスタリスクに続いてアンカー名、例えば*id001 )。これは、配送先住所が請求先住所と同じであると言う方法です。エイリアスは参照される値をコピーしないことに注意してください。それは本当に別のノードを指します。
アンカーを参照する前に、アンカーをドキュメントに表示する必要があります。彼らの名前はドキュメント内で一意である必要はありません。新しいアンカーが同じ名前で宣言されている場合、それは古いアンカーを置き換えます。
スカラーは最も単純なタイプです。マッピング、シーケンス、またはエイリアスではないものはすべてスカラーです。実際には、スカラーは単なる文字列です。上記2001-01-23例のすべてのキーは文字列スカラーですが、多くの値も同様です( 34843 、 Chrisなど)。
YAML 1.1仕様(Libyamlが使用するもの)は、この例のように数字または日付であっても、これらすべてのスカラーを文字列として扱います。タグを使用して、特定のスカラーが特定のタイプであることを明示的に述べることができます。
このライブラリのTYamlNodeレコードは、ノードに接続される可能性のあるタグに関係なく、Delphiタイプに変換する(試してToInteger )(試しToDoubleください)などの方法を提供します。
スカラーは、さまざまな「スタイル」で記述できます。
| )で始まります。上記の例では、 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メソッドの1つを使用してスカラー値をDelphiデータ型に変換できます。
ノードのタイプを確認するには、 NodeTypeプロパティまたはIsXXXプロパティのいずれかを使用できます( IsMapping 、 IsScalarなど)。
また、YAMLドキュメントをゼロから作成して、ファイルに保存したり、YAMLに変換したりすることもできます。 YAMLドキュメントを作成するには、必要なルートノードのタイプに応じて、 TYamlDocument.CreateXXXメソッドの1つを使用します。ドキュメントのサンプルを再構築する場合は、マッピングから始めて電話をかけます。
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を参照してください。