YAML
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.
Пример [править]
В некотором проекте нужно хранить конфигурацию, описывающую отображение текстовых команд на функции, с помощью регулярных выражений. Можно представить эту структуру простым текстом:
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="randomUri" 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:
- потоки 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 существует в языках программирования:
- JavaScript
- Objective-C
- C++
- .NET Framework (сайт проекта)
- Perl
- PHP
- Python
- Ruby (YAML включен в стандартную библиотеку начиная с версии 1.8.)
- Java
- Haskell
- XML [1] (пока только черновой вариант)
- Erlang
См. также [править]
Ссылки [править]
- YAML.ORG (англ.). — официальный сайт. Архивировано из первоисточника 10 февраля 2012. Проверено 29 ноября 2010.
- YAML. CustisWiki. Заказные ИнформСистемы. — введением в технологию и сравнение с альтернативными представлениями. Архивировано из первоисточника 10 февраля 2012. Проверено 29 апреля 2006.
| Это заготовка статьи о компьютерных языках. Вы можете помочь проекту, исправив и дополнив её. |
| Языки разметки документов | |
|---|---|
| Офисных документов | Compound Document Format · OOXML (SpreadsheetML, PresentationML, WordprocessingML) · ODF · UOF |
| Общеизвестные | HTML · XHTML · MathML · JSON · RTF · TeX · LaTeX |
| Менее известные | CML · C-HTML · ConTeXt · Crossmark · DITA · DocBook · eLML · EAD · Enriched text · FHTML · GML · GuideML · HDML · HyTime · HyperTeX · IPF · FictionBook · LilyPond · LinuxDoc · Lout · MIF · MAML · Markdown · MEI · MusicXML · OMDoc · OpenMath · POD · RTML · RTML · RFT · S1000D · TEI · Texinfo · troff · Вики-текст · WML · WapTV · XAML · YAML · Z Format |

