Neslib.yaml은 Yaml을 구문 분석하고 방출하고 Yaml 문서 및 스트림을 구성하는 라이브러리입니다.
Neslib.yaml은 Libyaml 라이브러리 위에 구축되어 다음을 수행합니다.
설치하려면 :
> git clone --recursive https://github.com/neslib/Neslib.Yaml이 라이브러리는 Neslib 저장소에만 의존하며,이 저장소와 함께 하위 모듈로 포함됩니다.
MacOS 32 비트를 제외한 모든 플랫폼의 경우 런타임 종속성이 없습니다. Libyaml 라이브러리는 실행 파일에 직접 연결됩니다. MacOS 32 비트의 경우 libyaml_mac32.dylib 라이브러리를 원격 경로 ContentsMacOS 에 배포해야합니다.
다음은 Yaml에 대한 매우 간단한 소개입니다. 자세한 정보는 공식 Yaml 사이트 또는 이와 같은 많은 온라인 리소스 중 하나를 살펴보십시오.
Yaml ( "Yaml Ai n't 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 가지 종류의 노드가 있습니다.
매핑은 델파이 사전과 유사합니다. 매핑은 키/값 쌍의 모음입니다. 위의 샘플 문서의 루트 노트는 매핑입니다. 키 invoice 값 34843 에 맵핑하고 7 개의 다른 키/값 쌍 ( date 부터 comments 까지)을 포함합니다. 키와 값은 모두 Yaml 유형 일 수 있지만 키를 위해 문자열을 고수하고 싶을 수도 있습니다.
매핑은 블록 표기법 (예에서와 같이) 또는 흐름 표기법 (Curly Braces {} 사용)으로 작성할 수 있습니다.
블록 표기법을 사용할 때 Yaml은 스코핑을 위해 들여 쓰기를 사용합니다. 탭이 아닌 압입을 위해 공간 만 허용됩니다. 동일한 레벨의 모든 값이 동일한 양의 공간을 사용하는 한 공간의 수는 중요하지 않습니다. 예에서, bill-to 키의 값은 또 다른 매핑입니다. 이 매핑은 그것이 bill-to 키에 속한다는 것을 나타 내기 위해 들여 쓰기됩니다.
시퀀스는 델파이 배열 또는 목록과 같습니다. 작은 시퀀스는 흐름 표기법 (사각형 브래킷 사용 [] )을 사용하여 작성할 수 있습니다. 더 크거나 복잡한 시퀀스는 일반적으로 예에서와 같이 블록 표기법으로 작성됩니다. product 키의 값은 두 제품 (농구 및 슈퍼 후프)의 시퀀스입니다. 시퀀스의 각 항목은 대시와 공간으로 시작합니다.
이 예에서 순서의 각 제품은 4 개의 키/값 쌍의 매핑입니다.
모든 노드에는 Tag 와 Anchor 두 가지 이상의 속성이 있습니다. 태그는 시맨틱 유형의 노드를 설명하는 데 사용됩니다. 태그는 그다지 일반적이지 않으므로이 소개에서 건너 뛸 것입니다. Neslib.yaml은 태그를 완전히 지원합니다.
앵커를 사용하여 문서의 노드를 표시 할 수 있습니다. 그런 다음 나중에 별칭을 사용 하여이 노드를 다시 참조 할 수 있습니다.
앵커는 앰퍼 샌드 ( & )로 접두사됩니다. 예에서, bill-to 키의 값에는 id001 이라는 앵커가 있습니다 (암페어는 이름의 일부가 아닙니다). 이 문서의 뒷부분에서 ship-to 키는 별칭 (별표 다음 앵커 이름, 예를 들어 *id001 )을 사용 하여이 앵커를 다시 언급합니다. 이것은 배송 주소가 청구 주소와 동일하다고 말하는 방법입니다. 별칭은 참조 된 값을 복사하지 않습니다 . 실제로 다른 노드를 나타냅니다.
앵커는 참조되기 전에 문서에 나타나야 합니다 . 그들의 이름은 문서 내에서 독특 할 필요는 없습니다 . 새 앵커가 같은 이름으로 선언되면 오래된 앵커를 대체합니다.
스칼라는 가장 간단한 유형입니다. 매핑, 시퀀스 또는 별칭이 아닌 모든 것은 스칼라입니다. 실제로, 스칼라는 단지 끈 일뿐입니다. 위의 예제의 모든 키는 문자열 스칼라이지만 많은 값도 있습니다 (예 : 34843 , 2001-01-23 및 Chris ).
Yaml 1.1 사양 (Libyaml이 사용하는 것)은이 예제에서와 같이 숫자 나 날짜 라도이 모든 스칼라를 문자열로 취급합니다. 태그를 사용하여 특정 스칼라가 특정 유형임을 명시 적으로 명시 할 수 있습니다.
이 라이브러리의 TYamlNode 레코드는 노드에 연결될 수있는 태그에 관계없이 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 방법 중 하나를 사용하여 스칼라 값을 Delphi 데이터 유형으로 변환 할 수 있습니다.
노드의 유형을 확인하려면 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 ; Yaml 형식을 사용자 정의하기 위해 선택적 TYamlOutputSettings 레코드를 전달할 수 있습니다.
위에서 설명한 것보다 neslib.yaml에 더 많은 것이 있습니다. 자세한 내용은 잘 문서화 된 Neslib.Yaml.pas 소스 파일을 살펴볼 수 있습니다. 추가 사용 샘플은 단위 테스트, 특히 Tests.Neslib.Yaml.Sample.pas 파일에서 찾을 수 있습니다.
Neslib.yaml은 단순화 된 BSD 라이센스에 따라 라이센스가 부여됩니다.
자세한 내용은 License.txt를 참조하십시오.