YAML (рекурсивный акроним  — «YAML — не язык разметки», произн. ) — дружественный формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования.

В трактовке названия отражена история развития: на ранних этапах YAML расшифровывался как («ещё один язык разметки») и даже позиционировался как конкурент XML, но позже был переименован с целью акцентировать внимание на данных, а не на разметке документов.

Цели создания Согласно целям, озвученным Кларком Эвансом (), YAML 1.0 призван: быть понятным человеку; поддерживать структуры данных, родственные для языков программирования; быть переносимым между языками программирования; использовать цельную модель данных для поддержки обычного инструментария; поддерживать потоковую обработку; быть выразительным и расширяемым; быть лёгким в реализации и использовании.

К текущей редакции YAML (1.2) цели были изменены: пункты 2 и 3 поменяли местами; пункт 5 заменили на «YAML поддерживает обработку за один проход».

Версии Версия Дата выпуска YAML 1.0 29 января 2004 YAML 1.1 18 января 2005 YAML 1.2.0 21 июля 2009 YAML 1.2.1 1 октября 2009 YAML 1.2.2 1 октября 2021

Синтаксис Синтаксис YAML минималистичен, особенно по сравнению с синтаксисом XML. В спецификации указано, что большое влияние на YAML оказал стандарт RFC 822. Ниже приведены образцы различных компонентов разметки. Следует заметить, что наличие варианта записи в однострочном формате делает JSON допустимым подмножеством YAML.

Последовательности (списки) --- # Список фильмов: последовательность в блочном формате - 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 позволяет задавать подстановки с помощью якорей & и псевдонимов (*). Пример aliases: #последовательность настроек - &myAlias1 datakey: dataval 1 moredata: morevals 1 - &myAlias2 datakey: dataval 2 moredata: morevals 2 config: - *myAlias1 # *myAlias1 после парсинга будет заменен на [{"datakey": "dataval 1", "moredata": "morevals 1"}] явное задание типа оформляется путём '!![указание типа]'. Пример, !!str 100 после разбора выдаст строковое значение «100» вместо целого числа 100. значения типа Дата/Время задаются в формате YYYY-MM-DD или YYYY-MM-DD HH:MM:SS. Если необходимо задать дату как строку, нужно заключать её в кавычки («2012-12-21»)

Пример В некотором проекте нужно , описывающую отображение () IRC-команд на функции, с помощью регулярных выражений.

Вот исходная конфигурация, представленная в виде таблицы: ircEvent method regexp PRIVMSG newUri "^http://.*" PRIVMSG deleteUri "^delete.*" PRIVMSG randomUri "^random.*"

В YAML эта конфигурация может быть представлена следующим образом:

bindings: - ircEvent: PRIVMSG method: newUri regexp: '^http://.*' - ircEvent: PRIVMSG method: deleteUri regexp: '^delete.*' - ircEvent: PRIVMSG method: randomUri regexp: '^random.*' или bindings: - {ircEvent: PRIVMSG, method: newUri, regexp: '^http://.*'} - {ircEvent: PRIVMSG, method: deleteUri, regexp: '^delete.*'} - {ircEvent: PRIVMSG, method: randomUri, regexp: '^random.*'}

Для сравнения, в XML-представлении данная конфигурация может быть представлена следующим образом:

<bindings> <binding> <ircEvent>PRIVMSG</ircEvent> <method>newUri</method> <regexp>^http://.*</regexp> </binding> <binding> <ircEvent>PRIVMSG</ircEvent> <method>deleteUri</method> <regexp>^delete.*</regexp> </binding> <binding> <ircEvent>PRIVMSG</ircEvent> <method>randomUri</method> <regexp>^random.*</regexp> </binding> </bindings> или <bindings> <binding ircEvent="PRIVMSG" method="newUri" regexp="^http://.*" /> <binding ircEvent="PRIVMSG" method="deleteUri" regexp="^delete.*" /> <binding ircEvent="PRIVMSG" method="randomUri" regexp="^random.*" /> </bindings>

В JSON можно выразить это так: { "bindings": [

"ircEvent": "PRIVMSG", "method": "newUri", "regexp": "^http://.*" },

"ircEvent": "PRIVMSG", "method": "deleteUri", "regexp": "^delete.*" },

"ircEvent": "PRIVMSG", "method": "randomUri", "regexp": "^random.*"

] }

Вложенные XML-элементы могут использоваться для отображения произвольных структур, а YAML более близок к отображению типичных моделей данных из Ruby, Perl, Python, Java, позволяя описывать свободные сочетания последовательностей, сопоставлений и скалярных типов — то есть ближе к реальным структурам данных языков программирования, и не требует различных соглашений про DOM-отображения структур данных на документы и обратно, как требуется в XML.

Примечания

Ссылки

Категория:Языки разметки Категория:Файлы конфигурации