YAML

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
YAML
Расширение

.yaml или .yml

Опубликован

11 мая 2001

Последний выпуск

1.2 (Third Edition) / 2009-10-01; 1846 дней тому назад

Тип формата

Обмен данными

Открытый формат?

Да

Сайт

yaml.org


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, Dancer, Symfony, GAE framework, Google App Engine и Dart.

Пример[править | править вики-текст]

Пример использования
  YAML XML Текст
Исходный код:
event: PRIVMSG
methods:
  - name: newUri
    regexp: '^http://.*'
  - name: deleteUri
    regexp: '^delete.*'
  - name: randomUri
    regexp: '^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>
PRIVMSG newUri ^http://.*

PRIVMSG deleteUri ^delete.*
PRIVMSG randomUri ^random.*

Пояснения YAML более близок к отображению типичных моделей данных из Perl, Python, Java, позволяя описывать свободные сочетания последовательностей, сопоставлений и скалярных типов — то есть ближе к реальным структурам данных языков программирования, и не требует различных соглашений про DOM-отображения структур данных на документы и обратно(как требуется в XML). Исходный код занимает больше места, даже укороченный вариант:
<event name="PRIVMSG">
    <method name="newUri" regex="^http://.*" />
    <method name="deleteUri" regex="^delete.*" />
    <method name="randomUri" regex="^random.*" /> 
</event>
— не описывает ни свободных сочетаний последовательностей, ни сопоставлений, ни скалярных типов, и требует различных соглашений про DOM-отображения структур данных на документы и обратно(отметим также, что вложенные XML элементы могут использоваться для отображения произвольных структур, в отличие от языка 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".
  • значения типа Дата/Время задаются в формате YYYY-MM-DD или YYYY-MM-DD HH:MM:SS. Если необходимо задать дату, как строку, нужно заключать ее в кавычки ("2012-12-21")

Реализации[править | править вики-текст]

Поддержка YAML существует в языках программирования:

См. также[править | править вики-текст]

Ссылки[править | править вики-текст]