YAML

Поделись знанием:
Перейти к: навигация, поиск
YAML
Последний выпуск

1.2 (Third Edition) / 2009-10-01; 5402 дня тому назад

Тип формата

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

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

Да

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

В трактовке названия отражена история развития: на ранних этапах YAML расшифровывался как Yet Another Markup Language («Ещё один язык разметки») и даже позиционировался как конкурент XML, но позже был переименован с цельюК:Википедия:Статьи без источников (тип: не указан)[источник не указан 3313 дней] акцентировать внимание на данных, а не на разметке документов.





Цели создания

Согласно целям озвученным Кларком Эвансом (англ. Clark Evans), YAML 1.0 призван [yaml.org/spec/1.0/]:

  1. быть легко понятным человеку;
  2. поддерживать структуры данных, родные для языков программирования;
  3. быть переносимым между языками программирования;
  4. использовать цельную модель данных для поддержки обычного инструментария;
  5. поддерживать потоковую обработку;
  6. быть выразительным и расширяемым;
  7. быть лёгким в реализации и использовании;

К текущей редакции YAML (1.2) в эти цели были внесены некоторые изменения [www.yaml.org/spec/1.2/spec.html]:

  • пункты 2 и 3 поменялись местами
  • пункт 5 был заменен на «YAML поддерживает обработку в один проход»

Легкость для чтения и записи

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

Использование

YAML в основном используется как формат для файлов конфигурации. Применяется для настройки веб-каркасов Ruby on Rails, Dancer, Symfony, GAE framework, Google App Engine и Dart. Также является основным языком описания классов, ресурсов и манифестов для пакетов приложений OpenStack [wiki.openstack.org/wiki/Murano Murano Project] К:Википедия:Статьи без источников (тип: не указан)[источник не указан 3313 дней].

Пример

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

Вот исходная конфигурация, представленная в виде таблицы:

ircEvent method regexp
PRIVMSG newUri "^.*"
PRIVMSG deleteUri "^delete.*"
PRIVMSG randomUri "^random.*"

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

bindings:
  - ircEvent: PRIVMSG
    method: newUri
    regexp: '^.*'
  - ircEvent: PRIVMSG
    method: deleteUri
    regexp: '^delete.*'
  - ircEvent: PRIVMSG
    method: randomUri
    regexp: '^random.*'

Сравнение с XML

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

<bindings>
    <binding>
        <ircEvent>PRIVMSG</ircEvent>
        <method>newUri</method>
        <regex>^.*</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>

Альтернативный вариант, использующий атрибуты:

<bindings>
    <binding ircEvent="PRIVMSG" method="newUri" regex="^.*" />
    <binding ircEvent="PRIVMSG" method="deleteUri" regex="^delete.*" />
    <binding ircEvent="PRIVMSG" method="randomUri" regex="^random.*" />
</bindings>

Говоря об отличиях 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 позволяет задавать подстановки с помощью якорей & и алиасов (*). Пример
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 существует в языках программирования:

См. также

Напишите отзыв о статье "YAML"

Примечания

  1. [github.com/jbeder/yaml-cpp yaml-cpp]
  2. [yaml-net-parser.sourceforge.net/ yaml-net-parser]
  3. [github.com/go-yaml/yaml go-yaml]
  4. [github.com/nodeca/js-yaml JS-YAML]
  5. [yaml.org/xml.html YAXML, the (draft) XML Binding for YAML]

Ссылки

  • [www.yaml.org/ YAML.ORG] (англ.). — официальный сайт. Проверено 29 ноября 2010. [www.webcitation.org/65LP7B8Yt Архивировано из первоисточника 10 февраля 2012].
  • [lib.custis.ru/index.php/YAML YAML]. CustisWiki. Заказные ИнформСистемы. — введением в технологию и сравнение с альтернативными представлениями. Проверено 29 апреля 2006. [www.webcitation.org/65LPKtdaB Архивировано из первоисточника 10 февраля 2012].

Отрывок, характеризующий YAML

– Adieu, Andre! Rappelez vous que les malheurs viennent de Dieu, et que les hommes ne sont jamais coupables, [Прощай, Андрей! Помни, что несчастия происходят от бога и что люди никогда не бывают виноваты.] – были последние слова, которые он слышал от сестры, когда прощался с нею.
«Так это должно быть! – думал князь Андрей, выезжая из аллеи лысогорского дома. – Она, жалкое невинное существо, остается на съедение выжившему из ума старику. Старик чувствует, что виноват, но не может изменить себя. Мальчик мой растет и радуется жизни, в которой он будет таким же, как и все, обманутым или обманывающим. Я еду в армию, зачем? – сам не знаю, и желаю встретить того человека, которого презираю, для того чтобы дать ему случай убить меня и посмеяться надо мной!И прежде были все те же условия жизни, но прежде они все вязались между собой, а теперь все рассыпалось. Одни бессмысленные явления, без всякой связи, одно за другим представлялись князю Андрею.


Князь Андрей приехал в главную квартиру армии в конце июня. Войска первой армии, той, при которой находился государь, были расположены в укрепленном лагере у Дриссы; войска второй армии отступали, стремясь соединиться с первой армией, от которой – как говорили – они были отрезаны большими силами французов. Все были недовольны общим ходом военных дел в русской армии; но об опасности нашествия в русские губернии никто и не думал, никто и не предполагал, чтобы война могла быть перенесена далее западных польских губерний.
Князь Андрей нашел Барклая де Толли, к которому он был назначен, на берегу Дриссы. Так как не было ни одного большого села или местечка в окрестностях лагеря, то все огромное количество генералов и придворных, бывших при армии, располагалось в окружности десяти верст по лучшим домам деревень, по сю и по ту сторону реки. Барклай де Толли стоял в четырех верстах от государя. Он сухо и холодно принял Болконского и сказал своим немецким выговором, что он доложит о нем государю для определения ему назначения, а покамест просит его состоять при его штабе. Анатоля Курагина, которого князь Андрей надеялся найти в армии, не было здесь: он был в Петербурге, и это известие было приятно Болконскому. Интерес центра производящейся огромной войны занял князя Андрея, и он рад был на некоторое время освободиться от раздражения, которое производила в нем мысль о Курагине. В продолжение первых четырех дней, во время которых он не был никуда требуем, князь Андрей объездил весь укрепленный лагерь и с помощью своих знаний и разговоров с сведущими людьми старался составить себе о нем определенное понятие. Но вопрос о том, выгоден или невыгоден этот лагерь, остался нерешенным для князя Андрея. Он уже успел вывести из своего военного опыта то убеждение, что в военном деле ничего не значат самые глубокомысленно обдуманные планы (как он видел это в Аустерлицком походе), что все зависит от того, как отвечают на неожиданные и не могущие быть предвиденными действия неприятеля, что все зависит от того, как и кем ведется все дело. Для того чтобы уяснить себе этот последний вопрос, князь Андрей, пользуясь своим положением и знакомствами, старался вникнуть в характер управления армией, лиц и партий, участвовавших в оном, и вывел для себя следующее понятие о положении дел.
Когда еще государь был в Вильне, армия была разделена натрое: 1 я армия находилась под начальством Барклая де Толли, 2 я под начальством Багратиона, 3 я под начальством Тормасова. Государь находился при первой армии, но не в качестве главнокомандующего. В приказе не было сказано, что государь будет командовать, сказано только, что государь будет при армии. Кроме того, при государе лично не было штаба главнокомандующего, а был штаб императорской главной квартиры. При нем был начальник императорского штаба генерал квартирмейстер князь Волконский, генералы, флигель адъютанты, дипломатические чиновники и большое количество иностранцев, но не было штаба армии. Кроме того, без должности при государе находились: Аракчеев – бывший военный министр, граф Бенигсен – по чину старший из генералов, великий князь цесаревич Константин Павлович, граф Румянцев – канцлер, Штейн – бывший прусский министр, Армфельд – шведский генерал, Пфуль – главный составитель плана кампании, генерал адъютант Паулучи – сардинский выходец, Вольцоген и многие другие. Хотя эти лица и находились без военных должностей при армии, но по своему положению имели влияние, и часто корпусный начальник и даже главнокомандующий не знал, в качестве чего спрашивает или советует то или другое Бенигсен, или великий князь, или Аракчеев, или князь Волконский, и не знал, от его ли лица или от государя истекает такое то приказание в форме совета и нужно или не нужно исполнять его. Но это была внешняя обстановка, существенный же смысл присутствия государя и всех этих лиц, с придворной точки (а в присутствии государя все делаются придворными), всем был ясен. Он был следующий: государь не принимал на себя звания главнокомандующего, но распоряжался всеми армиями; люди, окружавшие его, были его помощники. Аракчеев был верный исполнитель блюститель порядка и телохранитель государя; Бенигсен был помещик Виленской губернии, который как будто делал les honneurs [был занят делом приема государя] края, а в сущности был хороший генерал, полезный для совета и для того, чтобы иметь его всегда наготове на смену Барклая. Великий князь был тут потому, что это было ему угодно. Бывший министр Штейн был тут потому, что он был полезен для совета, и потому, что император Александр высоко ценил его личные качества. Армфельд был злой ненавистник Наполеона и генерал, уверенный в себе, что имело всегда влияние на Александра. Паулучи был тут потому, что он был смел и решителен в речах, Генерал адъютанты были тут потому, что они везде были, где государь, и, наконец, – главное – Пфуль был тут потому, что он, составив план войны против Наполеона и заставив Александра поверить в целесообразность этого плана, руководил всем делом войны. При Пфуле был Вольцоген, передававший мысли Пфуля в более доступной форме, чем сам Пфуль, резкий, самоуверенный до презрения ко всему, кабинетный теоретик.
Кроме этих поименованных лиц, русских и иностранных (в особенности иностранцев, которые с смелостью, свойственной людям в деятельности среди чужой среды, каждый день предлагали новые неожиданные мысли), было еще много лиц второстепенных, находившихся при армии потому, что тут были их принципалы.
В числе всех мыслей и голосов в этом огромном, беспокойном, блестящем и гордом мире князь Андрей видел следующие, более резкие, подразделения направлений и партий.
Первая партия была: Пфуль и его последователи, теоретики войны, верящие в то, что есть наука войны и что в этой науке есть свои неизменные законы, законы облического движения, обхода и т. п. Пфуль и последователи его требовали отступления в глубь страны, отступления по точным законам, предписанным мнимой теорией войны, и во всяком отступлении от этой теории видели только варварство, необразованность или злонамеренность. К этой партии принадлежали немецкие принцы, Вольцоген, Винцингероде и другие, преимущественно немцы.