Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

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ů.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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:

Martin Malý

Martin Maly

Začal programovat v roce 1984 s progra­movatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď je rád, že neprogramuje…

Školení Google+ pro firmy

DW - Školení PPC
  • Jak využít Google+ pro firemní komunikaci a marketing.
  • Čím se liší Google+ od Twitteru a Facebooku z pohledu firemního využití.
  • Jak využít Google+ v souladu s pravidly užívání.
  • Založení Google+ Page (Stránky) krok po kroku, včetně praktických tipů.

Detailní informace o školení Google+ »

Přehled názorů

S tou jednoduchostí nevím
wayan 4. 12. 2009 09:18
Nový
└ 
Re: S tou jednoduchostí nevím
Kit 5. 12. 2009 13:26
Nový
slozena data
fous 4. 12. 2009 10:40
Nový
└ 
Re: slozena data
nikdo 4. 12. 2009 23:46
Nový
 
└ 
Re: slozena data
Martin Malý 5. 12. 2009 13:49
Nový
Nádhera
Zuzka 4. 12. 2009 12:35
Nový
├ 
Re: Nádhera
nikdo 4. 12. 2009 23:48
Nový
└ 
Re: Nádhera
Inkvizitor 6. 12. 2009 01:47
Nový
 
└ 
Re: Nádhera
Zuzka 6. 12. 2009 11:19
Nový
 
 
└ 
Re: Nádhera
Inkvizitor 6. 12. 2009 14:35
Nový
 
 
 
└ 
Re: Nádhera
Peter Rybar 6. 12. 2009 17:09
Nový
 
 
 
 
└ 
Re: Nádhera
Culibrk 7. 12. 2009 08:47
Nový
 
 
 
 
 
└ 
Re: Nádhera
Alenka 7. 12. 2009 09:32
Nový
 
 
 
 
 
 
└ 
Re: Nádhera
Me 7. 12. 2009 22:01
Nový
Bílé znaky
Mirek 4. 12. 2009 14:52
Nový
├ 
Re: Bílé znaky
Jirka Kosek 4. 12. 2009 15:24
Nový
│
├ 
Re: Bílé znaky
nikdo 4. 12. 2009 23:49
Nový
│
└ 
Re: Bílé znaky
Mirek 6. 12. 2009 10:41
Nový
└ 
Re: Bílé znaky
paranoiq 4. 12. 2009 16:29
Nový
 
└ 
Re: Bílé znaky
Inkvizitor 6. 12. 2009 01:41
Nový
dalsi format ?
AlYOSHA 4. 12. 2009 18:36
Nový
HAML
Kit 5. 12. 2009 13:30
Nový
└ 
Re: HAML
theninja 6. 12. 2009 14:24
Nový
Re: YAML: Serializační formát pro ukládání dat
Jakub D. 5. 12. 2009 13:48
Nový
├ 
Re: YAML: Serializační formát pro ukládání dat
Kit 5. 12. 2009 14:29
Nový
└ 
Re: YAML: Serializační formát pro ukládání dat
Peter Rybar 6. 12. 2009 18:25
Nový
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Petr Bíža 7. 12. 2009 08:14
Nový
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Peter Rybar 7. 12. 2009 09:41
Nový
 
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Petr Bíža 7. 12. 2009 09:52
Nový
 
 
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Peter Rybar 7. 12. 2009 10:10
Nový
 
 
 
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Petr Bíža 7. 12. 2009 10:34
Nový
 
 
 
 
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Peter Rybar 7. 12. 2009 10:54
Nový
 
 
 
 
 
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Petr Bíža 7. 12. 2009 11:31
Nový
 
 
 
 
 
 
 
 
└ 
Re: YAML: Serializační formát pro ukládání dat
Peter Rybar 7. 12. 2009 12:07
Nový
YAML je intuitivni a zaroven pevne specifikovany format, slava mu
omo 5. 12. 2009 16:35
Nový
Já favorizuji ...
pravdokop - 6. 12. 2009 01:35
Nový
└ 
Re: Já favorizuji ...
Kit 6. 12. 2009 10:26
Nový
 
└ 
Re: Já favorizuji ...
pravdokop - 6. 12. 2009 14:08
Nový
Serializace polí a hashů do XML
wayan 6. 12. 2009 10:46
Nový
└ 
Re: Serializace polí a hashů do XML
Peter Rybar 6. 12. 2009 17:49
Nový
 
└ 
Tak se mi zdá, že si tady někdo honí triko.
pravdokop - 6. 12. 2009 19:23
Nový
 
 
└ 
Re: Tak se mi zdá, že si tady někdo honí triko.
Peter Rybar 6. 12. 2009 19:44
Nový
aano
stej 6. 12. 2009 20:58
Nový
fajn clanek
ld 6. 12. 2009 22:46
Nový
Vnořené pole
Me 7. 12. 2009 22:22
Nový
└ 
Re: Vnořené pole
peter 7. 12. 2009 23:56
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem