YAML — YAML
Rozszerzenia nazw plików |
.yaml , .yml
|
---|---|
Rodzaj mediów internetowych | Nie zarejestrowany |
Pierwsze wydanie | 11 maja 2001 r |
Najnowsze wydanie | 1.2 (wydanie trzecie) (1 października 2009 ) |
Rodzaj formatu | Wymiana danych |
Otwarty format ? | tak |
Strona internetowa | yaml |
YAML ( patrz § Historia i nazwa ) to czytelny dla człowieka język serializacji danych . Jest powszechnie używany w plikach konfiguracyjnych oraz w aplikacjach, w których dane są przechowywane lub przesyłane. YAML jest przeznaczony dla wielu takich samych aplikacji komunikacyjnych jak Extensible Markup Language (XML), ale ma minimalną składnię, która celowo różni się od SGML . Używa zarówno wcięć w stylu Pythona, aby wskazać zagnieżdżanie, jak i bardziej kompaktowego formatu, który używa [...]
do list i {...}
map, dlatego pliki JSON są prawidłowe w YAML 1.2.
Dozwolone są niestandardowe typy danych, ale YAML natywnie koduje skalary (takie jak ciągi , liczby całkowite i zmiennoprzecinkowe ), listy i tablice asocjacyjne (znane również jako mapy, słowniki lub skróty). Te typy danych są oparte na języku programowania Perl , chociaż wszystkie powszechnie używane języki programowania wysokiego poziomu mają bardzo podobne koncepcje. Składnia wyśrodkowana na dwukropek, używana do wyrażania par klucz-wartość , jest inspirowana nagłówkami poczty elektronicznej zdefiniowanymi w RFC 822 , a separator dokumentu ---
jest zapożyczony z MIME ( RFC 2046 ). Sekwencje ucieczki są ponownie używane z C , a zawijanie białych znaków w ciągach wielowierszowych jest inspirowane HTML . Listy i skróty mogą zawierać zagnieżdżone listy i skróty, tworząc strukturę drzewa ; dowolne wykresy mogą być reprezentowane za pomocą aliasów YAML (podobnie jak XML w SOAP ). YAML jest przeznaczony do odczytu i zapisu w strumieniach, funkcja inspirowana SAX .
Obsługa czytania i pisania YAML jest dostępna dla wielu języków programowania. Niektóre edytory kodu źródłowego, takie jak Emacs i różne zintegrowane środowiska programistyczne, mają funkcje ułatwiające edycję YAML, takie jak składanie zagnieżdżonych struktur lub automatyczne podświetlanie błędów składniowych.
Oficjalne zalecane rozszerzenie nazwy pliku dla plików YAML istnieje .yaml
od 2006 roku.
Historia i nazwa
YAML ( / j ć m əl / , rymy z wielbłąda ) został po raz pierwszy zaproponowany przez Clark Evans w 2001 roku, który zaprojektował ją razem z Ingy Dot Net i Oren Ben-Kiki. Pierwotnie YAML miał oznaczać Yet Another Markup Language , ponieważ został wydany w erze, w której pojawiły się liczne języki znaczników do prezentacji i łączności (HTML, XML, SGML itp.). Jego początkowa nazwa miała być żartobliwym odniesieniem do krajobrazu technologicznego, odwołując się do jego celu jako języka znaczników z jeszcze inną konstrukcją, ale następnie została zmieniona na YAML Ain't Markup Language , rekurencyjny akronim , aby odróżnić jego celem jest zorientowanie na dane, a nie znaczniki dokumentów.
Projekt
Składnia
Ściągawka i pełna specyfikacja dostępne są na oficjalnej stronie. Poniżej znajduje się streszczenie podstawowych elementów.
YAML akceptuje cały zestaw znaków Unicode, z wyjątkiem niektórych znaków sterujących i może być zakodowany w dowolnym z UTF-8 , UTF-16 lub UTF-32 . (Chociaż UTF-32 nie jest obowiązkowy, parser musi mieć zgodność z JSON ).
- Wcięcie białych znaków jest używane do oznaczania struktury; jednak znaki tabulacji nie są dozwolone jako część tego wcięcia.
- Komentarze zaczynają się od znaku liczby (
#
), mogą zaczynać się w dowolnym miejscu w wierszu i trwać do końca wiersza. Komentarze muszą być oddzielone od innych tokenów znakami odstępu. Jeśli wewnątrz ciągu pojawia się # znaków, to są to#
literały znaku liczby ( ). - Elementy listy są oznaczone wiodącym łącznikiem (
-
) z jednym elementem w wierszu.- Listę można również określić, umieszczając tekst w nawiasach kwadratowych (
[...]
) z każdym wpisem oddzielonym przecinkiem .
- Listę można również określić, umieszczając tekst w nawiasach kwadratowych (
- Asocjacyjna pozycja jest przedstawiona za pomocą grubego przestrzeń w postaci klucz: wartość jednej pozycji na linii. YAML wymaga, aby po dwukropku występowała spacja, aby wartości skalarne, takie jak,
http://www.wikipedia.org
mogły być ogólnie reprezentowane bez konieczności umieszczania ich w cudzysłowie.- Znak zapytania może być stosowany przed klucza w formie „klucz: wartość”, aby umożliwić klucz zawiera wiodące myślniki, nawiasy kwadratowe, etc., bez cudzysłowów.
- Tablicę asocjacyjną można również określić za pomocą tekstu ujętego w nawiasy klamrowe (
{...}
), z kluczami oddzielonymi od wartości dwukropkami i wpisami oddzielonymi przecinkami (spacje nie są wymagane do zachowania zgodności z JSON).
-
Łańcuchy (jeden typ skalarny w YAML) są zwykle bez cudzysłowów, ale mogą być ujęte w cudzysłów podwójny (
"
) lub cudzysłów pojedynczy ('
).- W podwójnych cudzysłowach znaki specjalne mogą być reprezentowane przez sekwencje specjalne w stylu C , zaczynające się od ukośnika odwrotnego (
\
). Według dokumentacji jedyną obsługiwaną ucieczką ósemkową jest\0
. - W obrębie pojedynczych cudzysłowów jedyną obsługiwaną sekwencją specjalną jest podwójny pojedynczy cudzysłów (
''
) oznaczający sam pojedynczy cudzysłów, tak jak w'don''t'
.
- W podwójnych cudzysłowach znaki specjalne mogą być reprezentowane przez sekwencje specjalne w stylu C , zaczynające się od ukośnika odwrotnego (
- Skalary blokowe są oddzielone wcięciami z opcjonalnymi modyfikatorami, aby zachować (
|
) lub zagiąć (>
) nowe linie. - Wiele dokumentów w jednym strumieniu jest oddzielonych trzema myślnikami (
---
).- Trzy kropki (
...
) opcjonalnie kończą dokument w strumieniu.
- Trzy kropki (
- Powtarzające się węzły są początkowo oznaczone znakiem ampersand (
&
), a następnie oznaczone gwiazdką (*
). - Węzły mogą być oznaczone typem lub tagiem za pomocą podwójnego wykrzyknika (
!!
), po którym następuje ciąg, który można rozwinąć do identyfikatora URI. - Dokumenty YAML w strumieniu mogą być poprzedzone „dyrektywami” złożonymi ze znaku procentu (
%
), po którym następuje nazwa i parametry oddzielone spacjami. W YAML 1.1 zdefiniowano dwie dyrektywy:- Dyrektywa %YAML służy do identyfikowania wersji YAML w danym dokumencie.
- Dyrektywa %TAG jest używana jako skrót do przedrostków URI. Te skróty mogą być następnie używane w znacznikach typu węzła.
Dwa dodatkowe znaki sigila są zarezerwowane w YAML dla ewentualnej przyszłej specyfikacji: znak at ( @
) i backtick ( `
).
Podstawowe składniki
YAML oferuje styl "in-line" do oznaczania tablic asocjacyjnych i list. Oto próbka komponentów.
Konwencjonalny format blokowy wykorzystuje myślnik+spację, aby rozpocząć nowy element na liście.
--- # Favorite movies
- Casablanca
- North by Northwest
- The Man Who Wasn't There
Opcjonalny format wbudowany jest oddzielony przecinkiem + spacja i ujęty w nawiasy (podobnie jak JSON ).
--- # Shopping list
[milk, pumpkin pie, eggs, juice]
Klucze są oddzielone od wartości dwukropkiem+spacją. Wcięte bloki, powszechne w plikach danych YAML, używają wcięć i nowych wierszy do oddzielenia par klucz/wartość. Bloki wbudowane, powszechne w strumieniach danych YAML, używają przecinka + spacji, aby oddzielić pary klucz/wartość między nawiasami klamrowymi.
--- # Indented Block
name: John Smith
age: 33
--- # Inline Block
{name: John Smith, age: 33}
Ciągi znaków nie wymagają cudzysłowów. Istnieją dwa sposoby pisania ciągów wielowierszowych, jeden z zachowaniem nowych wierszy (przy użyciu |
znaku) i drugi, który składa nowe wiersze (przy użyciu >
znaku), po których następuje znak nowego wiersza.
data: |
There once was a tall man from Ealing
Who got on a bus to Darjeeling
It said on the door
"Please don't sit on the floor"
So he carefully sat on the ceiling
Domyślnie początkowe wcięcie (pierwszego wiersza) i końcowe białe znaki są usuwane, chociaż można jawnie określić inne zachowanie.
data: >
Wrapped text
will be folded
into a single
paragraph
Blank lines denote
paragraph breaks
Zgięty tekst konwertuje znaki nowej linii na spacje i usuwa wiodące białe znaki.
--- # The Smiths
- {name: John Smith, age: 33}
- name: Mary Smith
age: 27
- [name, age]: [Rae Smith, 4] # sequences as keys are supported
--- # People, by gender
men: [John Smith, Bill Jones]
women:
- Mary Smith
- Susan Williams
Obiekty i listy są ważnymi składnikami Yaml i można je mieszać. Pierwszy przykład to lista obiektów klucz-wartość, wszystkie osoby z rodziny Smith. Druga wymienia ich według płci; jest to obiekt klucz-wartość zawierający dwie listy.
Zaawansowane komponenty
Dwie cechy, które odróżniają YAML od możliwości innych języków serializacji danych, to struktury i typowanie danych.
Struktury YAML umożliwiają przechowywanie wielu dokumentów w jednym pliku, wykorzystanie referencji dla powtarzających się węzłów oraz użycie dowolnych węzłów jako kluczy.
Aby uzyskać przejrzystość, zwartość i uniknąć błędów wprowadzania danych, YAML zapewnia kotwice węzłów (używając &
) i referencje (używając *
). Odniesienia do kotwicy działają dla wszystkich typów danych (patrz odniesienie do statku w poniższym przykładzie).
Poniżej znajduje się przykład kolejki w sekwencerze instrumentów, w którym dwa kroki są wielokrotnie używane bez pełnego opisu za każdym razem.
--- # Sequencer protocols for Laser eye surgery
- step: &id001 # defines anchor label &id001
instrument: Lasik 2000
pulseEnergy: 5.4
pulseDuration: 12
repetition: 1000
spotSize: 1mm
- step: &id002
instrument: Lasik 2000
pulseEnergy: 5.0
pulseDuration: 10
repetition: 500
spotSize: 2mm
- step: *id001 # refers to the first step (with anchor &id001)
- step: *id002 # refers to the second step
- step: *id002
Jawne wpisywanie danych jest rzadko spotykane w większości dokumentów YAML, ponieważ YAML automatycznie wykrywa proste typy. Typy danych można podzielić na trzy kategorie: podstawowe, zdefiniowane i zdefiniowane przez użytkownika. Rdzeń to te, które mają istnieć w każdym parserze (np. floaty, int, stringi, listy, mapy, ...). Wiele bardziej zaawansowanych typów danych, takich jak dane binarne, jest zdefiniowanych w specyfikacji YAML, ale nie jest obsługiwanych we wszystkich implementacjach. Wreszcie YAML definiuje sposób na rozszerzenie definicji typów danych lokalnie, aby uwzględnić zdefiniowane przez użytkownika klasy, struktury lub prymitywy (np. zmiennoprzecinkowe o poczwórnej precyzji).
YAML automatycznie wykrywa typ danych encji, ale czasami chce się jawnie rzutować typ danych. Najczęstszą sytuacją jest sytuacja, w której łańcuch składający się z jednego słowa, który wygląda jak liczba, wartość logiczna lub znacznik, wymaga uściślenia poprzez ujęcie go w cudzysłów lub użycie jawnego znacznika typu danych.
---
a: 123 # an integer
b: "123" # a string, disambiguated by quotes
c: 123.0 # a float
d: !!float 123 # also a float via explicit data type prefixed by (!!)
e: !!str 123 # a string, disambiguated by explicit type
f: !!str Yes # a string via explicit type
g: Yes # a boolean True (yaml1.1), string "Yes" (yaml1.2)
h: Yes we have No bananas # a string, "Yes" and "No" disambiguated by context.
Nie każda implementacja YAML ma każdy typ danych zdefiniowany przez specyfikację. Te wbudowane typy używają prefiksu sigila z podwójnym wykrzyknikiem ( !!
). Szczególnie interesującymi, nie pokazanymi tutaj, są zestawy, uporządkowane mapy, sygnatury czasowe i szesnastkowe. Oto przykład danych binarnych zakodowanych w base64 .
---
picture: !!binary |
R0lGODdhDQAIAIAAAAAAANn
Z2SwAAAAADQAIAAACF4SDGQ
ar3xxbJ9p0qa7R0YxwzaFME
1IAADs=
Wiele implementacji YAML może obsługiwać typy danych zdefiniowane przez użytkownika dla serializacji obiektów. Lokalne typy danych nie są uniwersalnymi typami danych, ale są definiowane w aplikacji za pomocą biblioteki parsera YAML. Lokalne typy danych używają pojedynczego wykrzyknika ( !
).
---
myObject: !myClass { name: Joe, age: 15 }
Przykład
Hierarchia struktury danych jest utrzymywana przez wcięcia konturu.
---
receipt: Oz-Ware Purchase Invoice
date: 2012-08-06
customer:
first_name: Dorothy
family_name: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
size: 8
price: 133.7
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Centerville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
...
Zauważ, że ciągi nie wymagają umieszczania w cudzysłowie. Określona liczba spacji we wcięciu nie ma znaczenia, o ile elementy równoległe mają takie samo wyrównanie do lewej, a elementy zagnieżdżone hierarchicznie są dalej wcięte. Ten przykładowy dokument definiuje tablicę asocjacyjną z 7 kluczami najwyższego poziomu: jeden z kluczy, „items”, zawiera 2-elementową listę, z której każdy element jest tablicą asocjacyjną z różnymi kluczami. Wyświetlane są dane relacyjne i usuwanie nadmiarowości: zawartość tablicy asocjacyjnej „dostawa do” jest kopiowana z zawartości tablicy asocjacyjnej „odbiorcy”, zgodnie z etykietami zakotwiczenia ( &
) i odniesienia ( *
). Dla czytelności można dodać opcjonalne puste wiersze. W jednym pliku/strumieniu może istnieć wiele dokumentów, które są oddzielone znakiem ---
. Opcjonalnego ...
można użyć na końcu pliku (przydatne do sygnalizowania końca komunikacji strumieniowej bez zamykania potoku).
Cechy
Wcięte rozgraniczenie
Ponieważ YAML opiera się głównie na wcięciach konturu dla struktury, jest szczególnie odporny na kolizje ograniczników . Niewrażliwość YAML na cudzysłowy i nawiasy klamrowe w wartościach skalarnych oznacza, że można osadzić dokumenty XML, JSON, a nawet YAML w dokumencie YAML, po prostu wcinając go w literale blokowym (używając |
lub >
):
---
example: >
HTML goes into YAML without modification
message: |
<blockquote style="font: italic 1em serif">
<p>"Three is always greater than two,
even for large values of two"</p>
<p>--Author Unknown</p>
</blockquote>
date: 2007-06-01
YAML można umieścić w JSON przez cytowanie i unikanie wszystkich wewnętrznych cudzysłowów. YAML może być umieszczony w XML przez ucieczkę zastrzeżonych znaków ( <
, >
, &
, '
, "
) i konwersję białych znaków lub przez umieszczenie go w sekcji CDATA .
Niehierarchiczne modele danych
W przeciwieństwie do JSON, który może reprezentować dane tylko w modelu hierarchicznym, z każdym węzłem podrzędnym mającym jednego rodzica, YAML oferuje również prosty schemat relacyjny, który pozwala na odwoływanie się do powtórzeń identycznych danych z dwóch lub więcej punktów w drzewie, zamiast wprowadzania ich nadmiarowo w te punkty. Jest to podobne do funkcji IDREF wbudowanej w XML. Parser YAML następnie rozszerza te referencje do w pełni zapełnionych struktur danych, które implikują podczas wczytywania, więc jakikolwiek program używa parsera, nie musi być świadomy relacyjnego modelu kodowania, w przeciwieństwie do procesorów XML, które nie rozszerzają referencji. To rozszerzenie może poprawić czytelność, jednocześnie redukując błędy wprowadzania danych w plikach konfiguracyjnych lub protokołach przetwarzania, w których wiele parametrów pozostaje takich samych w sekwencyjnej serii rekordów, a tylko kilka się zmienia. Przykładem jest to, że rekordy „dostawy” i „odbiorcy” na fakturze są prawie zawsze tymi samymi danymi.
Względy praktyczne
YAML jest zorientowany liniowo i dlatego często łatwo jest przekonwertować nieustrukturyzowane dane wyjściowe istniejących programów do formatu YAML, zachowując jednocześnie większość wyglądu oryginalnego dokumentu. Ponieważ nie ma żadnych znaczników zamykających, nawiasów klamrowych ani cudzysłowów do zrównoważenia, ogólnie łatwo jest wygenerować dobrze sformułowany YAML bezpośrednio z rozproszonych instrukcji drukowania w niewyszukanych programach. Podobnie, ograniczniki białych znaków ułatwiają szybkie i brudne filtrowanie plików YAML przy użyciu zorientowanych wierszowo poleceń w grep, AWK, Perl, Ruby i Python.
W szczególności, w przeciwieństwie do języków znaczników, fragmenty kolejnych linii YAML same w sobie są dobrze sformatowanymi dokumentami YAML. Ułatwia to pisanie parserów, które nie muszą przetwarzać dokumentu w całości (np. równoważenie otwierających i zamykających znaczników oraz nawigowanie po cudzysłowach i znakach ucieczki), zanim zaczną wyodrębniać określone rekordy w jego obrębie. Właściwość ta jest szczególnie celowa podczas iteracji w pojedynczym, bezstanowym przejściu, nad rekordami w pliku, którego cała struktura danych jest zbyt duża, aby można ją było przechowywać w pamięci, lub dla których odtworzenie całej struktury w celu wyodrębnienia jednego elementu byłoby nadmiernie kosztowne.
Wbrew intuicji, chociaż wcięcie może wydawać się komplikować głęboko zagnieżdżone hierarchie, YAML obsługuje wcięcia tak małe jak pojedyncza spacja, co może zapewnić lepszą kompresję niż języki znaczników. Dodatkowo bardzo głębokiego wcięcia można całkowicie uniknąć poprzez: 1) powrót do „stylu wbudowanego” (tj. formatu podobnego do JSON) bez wcięcia; lub 2) użycie kotwic relacyjnych w celu rozwinięcia hierarchii do płaskiej postaci, którą parser YAML w przejrzysty sposób odtworzy w pełnej strukturze danych.
Bezpieczeństwo
YAML jest językiem wyłącznie do reprezentacji danych i dlatego nie zawiera wykonywalnych poleceń. Chociaż sprawdzanie poprawności i bezpieczne parsowanie jest z natury możliwe w każdym języku danych, implementacja jest tak znaną pułapką, że brak powiązanego języka poleceń YAML może być względną korzyścią w zakresie bezpieczeństwa.
Jednak YAML zezwala na tagi specyficzne dla języka, dzięki czemu dowolne obiekty lokalne mogą być tworzone przez parser, który obsługuje te tagi. Każdy parser YAML, który pozwala na wykonywanie wyrafinowanych instancji obiektów, otwiera możliwość ataku typu injection. Parsery Perla, które umożliwiają ładowanie obiektów dowolnych klas, tworzą tzw. wartości „błogosławione”. Użycie tych wartości może wywołać nieoczekiwane zachowanie, np. jeśli klasa używa przeciążonych operatorów. Może to prowadzić do wykonania dowolnego kodu Perla.
Podobnie sytuacja wygląda w przypadku parserów Pythona czy Rubiego. Zgodnie z dokumentacją PyYAML:
Zauważ, że możliwość skonstruowania dowolnego obiektu Pythona może być niebezpieczna, jeśli otrzymasz dokument YAML z niezaufanego źródła, takiego jak Internet. Funkcja
yaml.safe_load
ogranicza tę możliwość do prostych obiektów Pythona, takich jak liczby całkowite lub listy. [...]PyYAML pozwala na skonstruowanie dowolnego typu obiektu Pythona. Za pomocą
!!python/object
znacznika można tworzyć nawet instancje klas Pythona .
Przetwarzanie i reprezentacja danych
Specyfikacja YAML identyfikuje dokument instancji jako „Prezentację” lub „strumień znaków”. Podstawowe struktury logiczne w dokumencie instancji YAML to skalary, sekwencje i mapowania. Specyfikacja YAML wskazuje również na pewne podstawowe ograniczenia, które mają zastosowanie do tych podstawowych struktur logicznych. Na przykład zgodnie ze specyfikacją klucze mapujące nie mają kolejności. W każdym przypadku, gdy kolejność węzłów jest istotna, należy użyć sekwencji.
Co więcej, definiując zgodność dla procesorów YAML, specyfikacja YAML definiuje dwie podstawowe operacje: dump i load . Wszystkie procesory zgodne z YAML muszą zapewniać co najmniej jedną z tych operacji i opcjonalnie mogą udostępniać obie. Wreszcie specyfikacja YAML definiuje model informacji lub „graf reprezentacji”, który musi zostać utworzony podczas przetwarzania zarówno dla operacji zrzutu, jak i ładowania , chociaż ta reprezentacja nie musi być udostępniana użytkownikowi za pośrednictwem interfejsu API.
Porównanie z innymi formatami serializacji
Porównanie z JSON
Składnia JSON jest podstawą wersji 1.2 YAML, która została ogłoszona w wyraźnym celu doprowadzenia YAML do „zgodności z JSON jako oficjalnym podzbiorem”. Chociaż wcześniejsze wersje YAML nie były ściśle kompatybilne, rozbieżności były rzadko zauważalne, a większość dokumentów JSON może być analizowana przez niektóre parsery YAML, takie jak Syck. Dzieje się tak, ponieważ struktura semantyczna JSON jest równoważna z opcjonalnym „wbudowanym stylem” pisania YAML. Chociaż rozszerzone hierarchie można napisać w stylu wbudowanym, takim jak JSON, nie jest to zalecany styl YAML, z wyjątkiem sytuacji, gdy pomaga to w przejrzystości.
YAML ma wiele dodatkowych funkcji, których brakuje w JSON, w tym komentarze, rozszerzalne typy danych, kotwice relacyjne, ciągi znaków bez cudzysłowów i typy mapowania zachowujące kolejność kluczy.
Porównanie z TOML
Z jednej strony YAML jest znacznie bardziej złożony w porównaniu do TOML – specyfikacja YAML zawierała 23 449 słów, podczas gdy specyfikacja TOML miała tylko 3339 słów. Z drugiej strony YAML jest mniej gadatliwy, bardziej DRY , składniowo mniej zaszumiony, a hierarchia dokumentu jest oczywista z wcięcia.
Porównanie z XML
YAML nie ma pojęcia atrybutów tagów, które można znaleźć w XML. Zamiast tego YAML ma rozszerzalne deklaracje typów (w tym typy klas dla obiektów).
Sam YAML nie posiada zdefiniowanych w języku XML deskryptorów schematu dokumentów, które pozwalają na przykład na samosprawdzenie dokumentu. Istnieje jednak kilka zewnętrznie zdefiniowanych języków deskryptorów schematu dla YAML (np. Doctrine , Kwalify i Rx), które spełniają tę rolę. Co więcej, semantyka dostarczana przez deklaracje typu zdefiniowanego w języku YAML w samym dokumencie YAML często łagodzi potrzebę walidatora w prostych, typowych sytuacjach. Ponadto YAXML , który reprezentuje struktury danych YAML w XML, umożliwia zastosowanie importerów schematów XML i mechanizmów wyjściowych, takich jak XSLT, do YAML.
Porównanie formatów serializacji danych zapewnia bardziej kompleksowe porównanie YAML z innymi formatami serializacji.
Oprogramowanie (emitery i parsery)
W przypadku stałych struktur danych pliki YAML można po prostu wygenerować za pomocą poleceń drukowania , które zapisują zarówno dane, jak i dekorację specyficzną dla YAML. Aby zrzucić różne lub złożone dane hierarchiczne, preferowany jest dedykowany emiter YAML . Podobnie proste pliki YAML (np. pary klucz-wartość) są łatwo analizowane za pomocą wyrażeń regularnych. W przypadku bardziej złożonych lub zróżnicowanych struktur danych zalecany jest formalny parser YAML .
Emitery i parsery YAML istnieją dla wielu popularnych języków. Większość z nich jest napisana w samym języku ojczystym. Niektóre są powiązaniami językowymi biblioteki C libyaml ; mogą działać szybciej. Kiedyś istniała inna biblioteka C, o nazwie Syck , napisana i osierocona, z powodu szczęścia : jest nieutrzymywana, nie ma autorytatywnego pakietu źródłowego, a strona internetowa została przejęta. Stąd jedyną godną polecenia biblioteką C jest libyaml . Został pierwotnie opracowany przez Kirilla Simonova. W 2018 roku rozwój został wznowiony przez nowych opiekunów Iana Cordasco i Ingy döt Net .
Programiści C++ mają do wyboru bibliotekę C libyaml i bibliotekę C++ libyaml-cpp . Oba mają całkowicie niezależne bazy kodu i zupełnie inne API . Biblioteka libyaml-cpp nadal ma główny numer wersji 0, co wskazuje, że API może się zmienić w dowolnym momencie, co faktycznie miało miejsce po wersji 0.3. Istnieje implementacja skoncentrowana na gramatyce napisana w C#, której celem jest rozszerzenie zagnieżdżonych elementów.
Niektóre implementacje YAML, takie jak YAML.pm Perla, ładują cały plik (strumień) i masowo go analizują . Inne implementacje, takie jak PyYaml, są leniwe i iterują w następnym dokumencie tylko na żądanie. W przypadku bardzo dużych plików, w których planuje się niezależną obsługę dokumentów, utworzenie instancji całego pliku przed przetwarzaniem może być niemożliwe. Tak więc w YAML.pm czasami trzeba podzielić plik na dokumenty i analizować je pojedynczo. YAML ułatwia to, ponieważ wymaga to po prostu podziału na znaczniku końca dokumentu, który jest zdefiniowany jako trzy osobne kropki w wierszu. Ten znacznik jest zabroniony w treści.
Krytyka
YAML został skrytykowany za znaczną białą przestrzeń , mylące funkcje, niezabezpieczone wartości domyślne oraz złożoną i niejednoznaczną specyfikację:
- Pliki konfiguracyjne mogą wykonywać polecenia lub ładować zawartość bez wiedzy użytkowników.
- Edytowanie dużych plików YAML jest trudne, ponieważ błędy wcięć mogą pozostać niezauważone.
- Autodetekcja typu jest źródłem błędów. Na przykład nie cytowane
Yes
iNO
są konwertowane na wartości logiczne; Numery wersji oprogramowania mogą zostać przekonwertowane na zmiennoprzecinkowe. - Obcięte pliki są często interpretowane jako prawidłowe YAML ze względu na brak terminatorów.
- Złożoność standardu doprowadziła do niespójnych implementacji i uniemożliwienia przenoszenia języka.
Dostrzegane wady i złożoność YAML doprowadziły do pojawienia się bardziej rygorystycznych alternatyw, takich jak StrictYAML i NestedText .