YAML: Serializační formát pro ukládání dat

Aplikace často potřebují ukládat a načítat různé údaje – nastavení, nejrůznější seznamy, data ke zpracování či další informace. Nejjednodušší je prostý zápis do datového souboru. Otázkou však zůstává: Jaký formát zvolit? Představíme si jeden z méně známých, ale přesto poměrně dobře standardizovaných formátů.

YAML (YAML Ain’t Markup Language – neplést s CSS frameworkem se stejným jménem) je formát pro serializaci dat textových souborů. Pokud potřebujeme v aplikaci načíst nebo uložit některá strukturovaná data, máme na výběr širokou škálu možností. Na jedné straně můžeme zvolit záznam interní reprezentace dat (binární formát), na druhé straně můžeme použít čistě textový formát. Každé z těchto řešení má svá pro i proti: Binární formát se ukládá i načítá většinou nejrychleji a většinou zabere nejméně místa. Není však obvykle zpracovatelný mimo aplikaci bez použití speciálních editorů. Textový formát zase zabere víc místa, jeho výhodou je ale to, že jej lze zpracovat i obyčejným textovým editorem.

Textové formáty pro ukládání dat mohou být různě čitelné. Když se podíváme např. na data, serializovaná pomocí PHP funkce „serialize“, nejsou příliš srozumitelná. Editovat takový soubor obyčejným editorem je pak téměř nemožné. Na druhé straně je např. formát XML, který lze relativně snadno číst i zapisovat, a lze jej i poměrně bezpečně editovat textovým editorem. Na druhou stranu úprava XML souboru vyžaduje poměrně slušné znalosti jeho syntaxe, a jeho zpracování v aplikaci není úplně triviální. Někde uprostřed co do složitosti editace a zpracování stojí jednoduché formáty typu formátu INI souborů.

Před několika lety se zdálo, že XML bude univerzálním formátem pro ukládání dat v textové podobě. XML je však pro velkou část aplikací příliš mocné, dalo by se říct že je „kanónem na vrabce“, navíc je plné využití všech jeho vlastností poměrně náročné. Jako reakce na tento stav přišlo POX (Plain Old XML) – tedy v podstatě XML bez jmenných prostorů, šablon, DTD a dalších vymožeností, kdy se z celého mohutného aparátu používají pouze elementy a atributy.

Podobnou cestou se vydali i tvůrci formátu YAML. YAML je formát, který nabízí jednoduchost INI souboru bez složitých konstrukcí (tagy, uzavírání elementů, escapování znaků), a zároveň je schopen vyjádřit v čistém textu i složitější konstrukce (struktury, pole). Syntaxe YAML bude připadat povědomá všem, kdo se setkali se syntaxí wiki systémů či nástrojů jako Texy! a Textile.

S YAML se můžeme setkat stále častěji, důvěrně známý bude pravděpodobně vývojářům, kteří používají Ruby, ale knihovny pro zpracování YAML souborů existují téměř pro každý používaný jazyk. Pojďme si představit základní prvky, které lze v YAML zapsat.

Sekvence

Nejjednodušším YAML prvkem je prostý seznam údajů, v YAML nazývaný sekvence. Zapsat ji lze jednoduše – vezměme si jako příklad seznam knih:

- Mistrovství v PHP5
- Zpracování XML souborů v PHP
- Harry Potter a zpracování XML souborů v PHP

Pokud tento soubor načteme, můžeme si vypsat jednotlivé prvky jako prvky pole. Např. print $knihy[0] vypíše „Mistrovství v PHP5“.

Sekvence může obsahovat libovolný formát dat:

- 5 # číslo
- 5.0 # desetinné číslo
- pět # řetězec
- 31.12.2008 # datum
- !!float 26 # desetinné číslo 26.0 (implicitně přetypováno)
- !!str 26 # řetězec "26" (implicitně přetypováno)

Důležité na sekvenci je to, že zachovává pořadí, v němž jsou data zapsána.

Znak dvojkřížku (#) s předcházející mezerou označuje, jak je pravděpodobně jasné, komentář.

Mapa

YAML umožňuje zapsat to, co známe z jiných jazyků jako „asociativní pole“ (či „slovník“) – tedy dvojice „klíč:hodnota“, kde klíč je unikátní údaj, který identifikuje konkrétní záznam. Například můžeme výše zmíněný seznam doplnit o autory:

Gutmans: Mistrovství v PHP5
Kosek: Zpracování XML souborů v PHP
Grudl: Harry Potter a zpracování XML souborů v PHP

Přístup k záznamům je přesně takový, jaký bychom očekávali: print $knihy['Kosek']. V terminologii YAML je takovýto typ záznamů nazývaný „mapa“. Za dvojtečkou, která odděluje klíč od hodnoty, musí být vždy mezera.

Dokumenty

Jeden YAML soubor může obsahovat víc logických celků, nazývaných „dokumenty“. Dokumenty jsou odděleny pomocí tří spojovníků (—) na samostatném řádku.

---
kniha: Mistrovství v PHP5
autor: Gutmans
cena: 500
---
kniha: XML a PHP
autor: Kosek
cena: 290

Pokud jsou data posílána komunikačním kanálem, lze pomocí tří teček (…) na samostatném řádku naznačit konec záznamu, aniž by byl otevřen nový záznam pomocí „—“ nebo zavřen komunikační kanál.

YAML soubory často začínají jakýmsi „záhlavím“ ve tvaru:

--- # Seznam knih

Složená data

Pomocí výše představených konstrukcí lze snadno zapsat i složitější datové struktury:

- datum: 10.10.2009
- čtenáři:
  WebExpo 2009: 1164
  Použijte SAX: 2316
  "YAML: Nový formát": 6942

Jde o seznam se dvěma položkami. První je asociativní pole („mapa“) s klíčem „datum“ a hodnotou 10.10.2009. Druhá položka seznamu je opět asociativní pole s klíčem „čtenáři“. Hodnotou je další pole, v němž jsou názvy článků a počty čtenářů (fiktivní, samosebou). Poslední klíč obsahuje dvojtečku, je proto uzavřen do uvozovek.

Je vidět, že struktura pro vnořená data se označuje, podobně jako v Pythonu, pomocí odsazení. print $clanky['čtenáři']['WebExpo 2009'] by mělo vypsat 1164.

Sekvence sekvencí

Představme si seznam zeleniny:

-
  - Paprika červená
  - Paprika zelená
  - Paprika žlutá
- Česnek čínský
- Cibule

První řádek je „položka sekvence bez hodnoty“ – označuje, že bude následovat odsazený vnořený seznam. Jednotlivé prvky výše zmíněného souboru vypíšeme takto:

print $zelenina[0][0];

print $zelenina[0][1];

print $zelenina[0][2];

print $zelenina[1];

print $zelenina[2];

Texty

vzkaz: >
  Vážený pane,
  váš článek mě velmi zaujal a rád bych jej vydal na Zdrojáku.
  Budu rád, pokud mi jej dodáte ve formátu HTML.
  S pozdravem 

  Martin Malý

Na výše zmíněném příkladu je dobře vidět snadnost syntaxe YAML. Jde opět o mapu, kde klíčem je „vzkaz“, a hodnotou je text. Operátor „>“ naznačuje, že následuje odsazený text, který tvoří jeden odstavec. YAML parser spojí všechny řádky, které následují po tomto operátoru a jsou odsazené, do jednoho souvislého textu (samosebou odstraní přebytečné mezery). Prázdný řádek vyhodnotí jako konec odstavce. Výše uvedený příklad bude tedy načten jako dva odstavce textu.

Místo operátoru „>“ můžeme použít operátor „|“. Rozdíl je v tom, že odsazené řádky budou pak vyhodnoceny jako oddělené odstavce – co řádek, to odstavec.

Keep a chomp

Výše popsané operátory lze zkombinovat s operátory „keep“ (+) a „chomp“ (-). Nejjednodušší na vysvětlení bude názorná ukázka:

Normální: |
  Záznam s jedním znakem NEWLINE 

Keep: |+
  Záznam se třemi znaky NEWLINE

Chomp: |-
  Záznam bez NEWLINE

...

Prostý operátor „|“ ponechá na konci textu znak „nový řádek“, ale prázdné řádky vynechá. Operátor se znakem keep (|+) ponechá všechny konce řádků tak jak jsou, až do začátku dalšího záznamu. Operátor s ořezáním (|-) odstraní poslední znak konce řádku.

Zjednodušený zápis sekvencí a map

Pro sekvence, složené z nemnoha jednoduchých dat, lze použít zjednodušený zápis. Například:

čísla:
 - 7
 - 11
 - 14
 - 21
 - 22
 - 37

 lze zapsat jako:

čísla: [7, 11, 14, 21, 22, 37]

Obdobně lze zapsat i mapy – místo hranatých závorek použijeme složené:

čísla: {první: 7, druhé: 11, třetí: 14, čtvrté: 21, páté: 22, šesté: 37}

Závěr

YAML je mnohem mocnější formát, než by se mohlo z tohoto stručného popisu zdát. Umožňuje vytvářet mnohem složitější struktury pomocí aliasů (operátory & a *), umožňuje vložit binární data (např. obrázky – v kódování BASE64), umožňuje spojovat údaje z různých dokumentů nebo nastavovat defaultní hodnoty.

Formát YAML dovoluje zapsat strukturovaná data, podobně jako XML, s menší režií a s vyšší uživatelskou přívětivostí, než má zápis v XML. Autoři jej označují jako „serializační formát“, tedy formát pro zápis strukturovaných dat v podobě textového souboru. Účel je obdobný jako např. u formátu JSON či u PHP funkcí serialize() a unserialize(). Jeho výhodou je však snazší čitelnost, větší vyjadřovací schopnosti a možnost snadné ruční editace.

Užitečné odkazy:

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 46

Přehled komentářů

wayan S tou jednoduchostí nevím
Kit Re: S tou jednoduchostí nevím
fous slozena data
nikdo Re: slozena data
Martin Malý Re: slozena data
Zuzka Nádhera
nikdo Re: Nádhera
Inkvizitor Re: Nádhera
Zuzka Re: Nádhera
Inkvizitor Re: Nádhera
pr.rybar Re: Nádhera
Culibrk Re: Nádhera
Alenka Re: Nádhera
Me Re: Nádhera
Mirek Bílé znaky
Jiří Kosek Re: Bílé znaky
nikdo Re: Bílé znaky
Mirek Re: Bílé znaky
paranoiq Re: Bílé znaky
Inkvizitor Re: Bílé znaky
AlYOSHA dalsi format ?
Kit HAML
theninja Re: HAML
Jakub D. Re: YAML: Serializační formát pro ukládání dat
Kit Re: YAML: Serializační formát pro ukládání dat
pr.rybar Re: YAML: Serializační formát pro ukládání dat
fos4 Re: YAML: Serializační formát pro ukládání dat
pr.rybar Re: YAML: Serializační formát pro ukládání dat
fos4 Re: YAML: Serializační formát pro ukládání dat
pr.rybar Re: YAML: Serializační formát pro ukládání dat
fos4 Re: YAML: Serializační formát pro ukládání dat
pr.rybar Re: YAML: Serializační formát pro ukládání dat
fos4 Re: YAML: Serializační formát pro ukládání dat
pr.rybar Re: YAML: Serializační formát pro ukládání dat
omo YAML je intuitivni a zaroven pevne specifikovany format, slava mu
pravdokop Já favorizuji ...
Kit Re: Já favorizuji ...
pravdokop Re: Já favorizuji ...
wayan Serializace polí a hashů do XML
pr.rybar Re: Serializace polí a hashů do XML
pravdokop Tak se mi zdá, že si tady někdo honí triko.
pr.rybar Re: Tak se mi zdá, že si tady někdo honí triko.
stej aano
ld fajn clanek
Me Vnořené pole
peter Re: Vnořené pole
Zdroj: https://www.zdrojak.cz/?p=3109