YAML — зручний для читання людиною формат серіалізації даних, концептуально близький до мов розмітки, але орієнтований на зручність введення-виведення типових структур даних багатьох мов програмування.

Назва YAML це рекурсивний акронім YAML Ain't Markup Language («YAML — не мова розмітки»). У назві відображена історія розвитку: на ранніх етапах мова називалася Yet Another Markup Language («Ще одна мова розмітки») і навіть розглядалася як конкурент XML, але пізніше була перейменована з метою акцентувати увагу на даних, а не на розбивці документів.

Особливості YAML створений Кларком Евансом (Clark Evans), для реалізації таких вимог: YAML короткий і зрозумілий; YAML дуже виразний і розширний; YAML допускає простий потоковий інтерфейс; YAML використовує структури даних, характерні для мов програмування; YAML легко реалізується (можливо, занадто легко); YAML використовує цілісну модель даних. Немає винятків — немає безладу.

Синтаксис YAML мінімальний, особливо в порівнянні з XML синтаксисом. У специфікації вказують, що великий вплив справив стандарт RFC 822.

Використання

YAML в основному використовується як формат для файлів конфігурації. Застосовується для установки вебкаркасів Ruby on Rails і Symfony.

Приклад У певному проекті потрібно зберігати конфігурацію, що описує відображення текстових команд на функції, за допомогою регулярних виразів. Можна подати цю структуру у вигляді простого тексту, подібного до конфігураційного файлу давньої UNIX-програми: PRIVMSG newUri ^http://.* PRIVMSG deleteUri ^delete.* PRIVMSG randomUri ^random.*

Тоді витрати на розбивку мінімальні, але все стає дуже негнучким — значення не можуть містити пробіли, не можуть бути багаторядковими тощо. Підходить тільки в простих випадках.

У XML витрати на розбивку значніші: <bindings> <binding> <ircEvent>PRIVMSG</ircEvent> <method>newUri</method> <regex>^http://.*</regex> </binding> <binding> <ircEvent>PRIVMSG</ircEvent> <method>deleteUri</method> <regex>^delete.*</regex> </binding> <binding> <ircEvent>PRIVMSG</ircEvent> <method>randomUri</method> <regex>^random.*</regex> </binding> </bindings>

Звичайно, можна зробити «дешевше» відображення з використанням атрибутів (і втратою гнучкості): <event name = "PRIVMSG"> <method name = "newUri" regex = "^http://.*" /> <method name = "deleteUri" regex = "^delete.*" /> <method name = "newUri" regex = "^random.*" /> </event>

Тепер те ж саме на YAML: event: PRIVMSG methods: - Name: newUri regexp: '^http://.*' - Name: deleteUri regexp: '^delete.*' - Name: randomUri regexp: '^random.*'

Говорячи про відмінності YAML від XML, відзначимо також, що вкладені XML елементи можуть використовуватися для відображення довільних структур, а YAML ближчий до відображення типових моделей даних з Perl, Python, Java, що дозволяє описувати вільні поєднання послідовностей, зіставлень і скалярних типів — це ближче до реальних структур даних мов програмування, і не вимагає різних угод про DOM-відображення структур даних на документи і назад, як потрібно в XML.

Синтаксичні елементи

Послідовності --- # Список фільмів: послідовність у блочному форматі - Casablanca - Spellbound - Notorious --- # Список покупок: послідовність у Однорядковому форматі [milk, bread, eggs, juice]

Зіставлення імені та значення --- # Блочний формат name: John Smith age: 33 --- # Однорядковий формат {name: John Smith, age: 33}

Блочні літерали

Переведення рядків зберігаються

There was a young fellow of Warwick Who had reason for feeling euphoric For he could, by election Have triune erection Ionic, Corinthian, and Doric

Переведення рядків зникають --- > Wrapped text will be folded into a single paragraph

Blank lines denote paragraph breaks

Послідовності із зіставлень - {Name: John Smith, age: 33} - Name: Mary Smith age: 27

Зіставлення з послідовностей men: [John Smith, Bill Jones] women: - Mary Smith - Susan Williams

Реалізації

Підтримка YAML існує в мовах програмування: JavaScript (здійснюється виведення YAML, але не розбір введення) Objective-C .NET Framework (сайт проекту ) Perl PHP Python Ruby (YAML включений у стандартну бібліотеку починаючи з версії 1.8.) Java Haskell XML (поки що тільки чорновий варіант)

Див. також JSON XML Haml

Посилання

YAML-парсер на Java Конвертер YAML у таблицю