YAML (рекурсивный акроним YAML Ain't Markup Language — «YAML — Не язык разметки») — «дружественный» формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования.
В трактовке названия отражена история развития: на ранних этапах YAML расшифровывался как Yet Another Markup Language («Ещё один язык разметки») и даже позиционировался как конкурент XML, но позже был переименован с целью[источник не указан 468 дней] акцентировать внимание на данных, а не на разметке документов.
Цели создания
Согласно целям озвученным Кларком Эвансом (англ. Clark Evans), YAML 1.0 призван:
быть легко понятным человеку;
поддерживать структуры данных, родные для языков программирования;
быть переносимым между языками программирования;
использовать цельную модель данных для поддержки обычного инструментария;
поддерживать потоковую обработку;
быть выразительным и расширяемым;
быть лёгким в реализации и использовании;
К текущей редакции YAML (1.2) в эти цели были внесены некоторые изменения:
пункты 2 и 3 поменялись местами
пункт 5 был заменен на «YAML поддерживает обработку в один проход»
Легкость для чтения и записи
Синтаксис YAML минималистичен, особенно по сравнению с XML синтаксисом. В спецификации указывают, что большое влияние оказал стандарт RFC 822
Использование
YAML в основном используется как формат для файлов конфигурации. Применяется для настройки веб-каркасов Ruby on Rails, Dancer, Symfony, GAE framework, Google App Engine и Dart. Также является основным языком описания классов, ресурсов и манифестов для пакетов приложений OpenStack Murano Project.
Сравнение с XML
Для сравнения, в XML-представлении, данная конфигурация может быть представлена следующим образом:
PRIVMSG newUri ^http://.*
PRIVMSG deleteUri ^delete.*
PRIVMSG randomUri ^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:
потоки YAML используют печатаемые Unicode-символы, как UTF-8, так и UTF-16
отступы из пробелов (символы табуляции не допускаются) используются для обозначения структуры
комментарии начинаются с символа “решетка” ( # ), могут начинаться в любом месте строки и продолжаются до конца строки
списки обозначаются начальным дефисом ( - ) с одним членом списка на строку, либо члены списка заключаются в квадратные скобки ( [ ] ) и разделяются запятой и пробелом ( , )
ассоциативные массивы представлены двоеточием с пробелом ( : ) в виде ключ: значение, по одной паре ключ-значение на строку, либо в виде пар, заключённых в фигурные скобки и разделенных запятой и пробелом ( , )
ключ в ассоциативном массиве может иметь в качестве префикса вопросительный знак ( ? ), что позволяет указать сложный ключ, например представленный в виде списка
строки записываются без кавычек, однако могут быть заключены в одиночные или двойные кавычки
внутри двойных кавычек могут быть использованы экранированные символы в C-стиле, начинающиеся с обратного слэша ( \ ) YAML позволяет задавать подстановки с помощью якорей & и алиасов (*). Пример
явное задание типа оформляется путём '!![указание типа]'. Пример, !!str 100 после парсинга выдаст значение "100". значения типа Дата/Время задаются в формате YYYY-MM-DD или YYYY-MM-DD HH:MM:SS. Если необходимо задать дату, как строку, нужно заключать её в кавычки ("2012-12-21")