YAML

редактировать
Удобочитаемый формат сериализации данных
YAML
Расширения имен файлов .yaml, . yml
Тип Интернет-носителя Не зарегистрирован
Первоначальный выпуск11 мая 2001 г.; 19 лет назад (2001-05-11)
Последний выпуск 1.2 (третье издание). (1 октября 2009 г.; 11 лет назад (2009-10-01))
Тип форматаОбмен данными
Открытый формат ?Да
Веб-сайтyaml.org

YAML (рекурсивная аббревиатура для "YAML Ain ' t Markup Language ") - это удобочитаемый язык сериализации данных. Он обычно используется для файлов конфигурации и в приложениях, где данные хранятся или передаются. YAML нацелен на многие из тех же коммуникационных приложений, что и Extensible Markup Language (XML), но имеет минимальный синтаксис, который намеренно отличается от SGML. Он использует как отступы в стиле Python для обозначения вложенности, так и более компактный формат, который использует [...]для списков и {...}для карты, делающие YAML 1.2 надмножеством из JSON.

Разрешены пользовательские типы данных, но YAML изначально кодирует скаляры (например, строки, целые числа и с плавающей запятой ), списки и ассоциативные массивы (также известные как карты, словари или хэши). Эти типы данных основаны на языке программирования Perl, хотя все широко используемые языки программирования высокого уровня имеют очень похожие концепции. Синтаксис с центром в двоеточии, используемый для выражения пар ключ-значение, основан на заголовках электронной почты, как определено в RFC 0822, и в документе . разделитель ---заимствован из MIME (RFC 2046 ). Escape-последовательности повторно используются из C, а перенос пробелов для многострочных строк основан на HTML. Списки и хэши могут содержать вложенные списки и хэши, образующие древовидную структуру ; произвольные графы могут быть представлены с использованием псевдонимов YAML (аналогично XML в SOAP ). YAML предназначен для чтения и записи в потоках, функция, вдохновленная SAX.

Поддержка чтения и записи YAML доступна для многих языков программирования. Некоторые редакторы исходного кода, такие как Emacs и различные интегрированные среды разработки, имеют функции, упрощающие редактирование YAML, такие как сворачивание вложенных структур или автоматическое выделение синтаксических ошибок.

Официально рекомендованное расширение имени файла для файлов YAML было .yamlс 2006 года.

Содержание
  • 1 История и имя
  • 2 Дизайн
    • 2.1 Синтаксис
    • 2.2 Основные компоненты
    • 2.3 Расширенные компоненты
    • 2.4 Пример
  • 3 Функции
    • 3.1 Разделение с отступом
    • 3.2 Неиерархические модели данных
    • 3.3 Практические соображения
    • 3.4 Безопасность
    • 3.5 Обработка и представление данных
  • 4 Сравнение с другими форматами сериализации
    • 4.1 Сравнение с JSON
    • 4.2 Сравнение с TOML
    • 4.3 Сравнение с XML
  • 5 Программное обеспечение (эмиттеры и парсеры)
  • 6 Критика
  • 7 См. Также
  • 8 Ссылки
  • 9 Внешние ссылки
История и имя

YAML (, рифмуется с верблюдом) был впервые предложен Кларком Эвансом в 2001 году, который разработал его вместе с Ingy döt Net и Oren Ben-Kiki. Первоначально YAML означал еще один язык разметки, ссылаясь на его назначение как язык разметки с еще одной конструкцией, но затем он был перепрофилирован как YAML Ain't Markup Language, a рекурсивный акроним, чтобы обозначить его цель как ориентированную на данные, а не на разметку документа.

Дизайн

Синтаксис

Шпаргалка и полная спецификация доступны на официальном сайте. Ниже приводится краткий обзор основных элементов.

YAML принимает весь набор символов Unicode, за исключением некоторых управляющих символов, и может быть закодирован в UTF-8, UTF-16 и UTF-32. (Хотя UTF-32 не является обязательным, он требуется, чтобы синтаксический анализатор имел JSON совместимость.)

  • Whitespace отступ используется для обозначения структуры; однако символы табуляции не допускаются как часть отступа.
  • Комментарии начинаются с числового знака (#), могут начинаться в любом месте строки и продолжаться до конца линия. Комментарии должны быть отделены от других токенов пробелами. Если символы # появляются внутри строки, то они являются литералами со знаком числа (#).
  • Элементы списка обозначаются ведущим дефисом (-) с одним элементом на линия.
  • Запись ассоциативного массива представлена ​​с помощью colon пробела в форме ключ: значение с одной записью на строку. YAML требует, чтобы двоеточие сопровождалось пробелом, чтобы скалярные значения, такие как http://www.wikipedia.org, обычно могли быть представлены без необходимости заключать их в кавычки.
    • A вопросительный знак можно использовать перед ключом в форме «? Ключ: значение», чтобы ключ мог содержать начальные тире, квадратные скобки и т. Д. Без кавычек.
    • Ассоциативный массив также может быть указан с помощью текста, заключенного в фигурные скобки ({...}), с ключами, отделенными от значений двоеточием, а записи разделены запятыми (пробелы не необходимо для совместимости с JSON).
  • Строки (скаляры ) обычно не заключаются в кавычки, но могут быть заключены в двойные кавычки (") или одинарные кавычки (').
    • В двойных кавычках специальные символы могут быть представлены с помощью escape-последовательностей стиля C, начинающихся с обратной косой черты (\). Согласно документации, единственный поддерживаемый восьмеричный escape-код - это \0.
  • Блочные скаляры разделены отступом с дополнительными модификаторами для сохранения (|) или сворачивания (>) новые строки.
  • Несколько документов в одном потоке разделяются тремя дефисами (---).
    • Три точки (...) необязательно заканчивают документ в потоке.
  • Повторяющиеся узлы первоначально обозначаются амперсандом () и после этого обозначены звездочкой (*).
  • . Узлы могут быть помечены типом или тегом с помощью восклицательного знака (!!), за которым следует строка, которая может быть расширена в URI.
  • Документам YAML в потоке могут предшествовать «директивы», состоящие из знака процента (%), за которыми следует имя и параметры, разделенные пробелами. В YAML 1.1 определены две директивы:
    • Директива% YAML используется для определения версии YAML в данном документе.
    • Директива% TAG используется как ярлык для префиксов URI. Эти ярлыки затем можно использовать в тегах типа узла.

Два дополнительных символа сигил зарезервированы в YAML для возможной будущей спецификации: в знаке (@) и обратная ссылка (`).

Базовые компоненты

YAML предлагает "встроенный" стиль для обозначения ассоциативных массивов и списков. Вот образец компонентов.

В обычном блочном формате дефис + пробел используется для начала нового элемента в списке.

--- # Любимые фильмы - Касабланка - Север к северо-западу - Человек, которого не было

Дополнительный встроенный формат разделяется запятой + пробелом и заключен в квадратные скобки (аналогично JSON ).

- - # Список покупок [молоко, тыквенный пирог, яйца, сок]

Ключи отделяются от значений двоеточием + пробелом. Блоки с отступом, обычно в файлах данных YAML, используют отступы и новые строки для разделения пар ключ / значение. Встроенные блоки, распространенные в потоках данных YAML, используют запятую + пробел для разделения пар ключ / значение между фигурными скобками.

--- # Имя блока с отступом: John Smith age: 33 --- # Встроенный блок {name: John Смит, возраст: 33}

Для строк не требуются кавычки. Есть два способа записать многострочные строки: один с сохранением новой строки (с помощью символа |) и второй, который сворачивает новую строку (используя символ >), за которыми следует символ новой строки.

данные: | Жил-был высокий мужчина из Илинга, который сел на автобус в Дарджилинг. На двери было написано: "Пожалуйста, не садитесь на полу" Поэтому он осторожно сел на потолок.

По умолчанию начальный отступ (первой строки) и конечный пробел удаляются, хотя можно явно указать другое поведение.

данные:>Обернутый текст будет свернут в один абзац. Пустые строки обозначают разрывы абзаца.

Сложенный текст преобразует новые строки в пробелы и удаляет начальные пробелы.

--- # Смиты - {имя: Джон Смит, возраст: 33} - имя: Мэри Смит, возраст: 27 - [имя, возраст]: [Рэй Смит, 4] # поддерживаются последовательности ключей --- # Люди, по полу мужчины: [Джон Смит, Билл Джонс] женщины: - Мэри Смит - Сьюзан Уильямс

Объекты и списки являются важными компонентами в yaml, и их можно смешивать. Первый пример - это список объектов "ключ-значение", все люди из семьи Смит. Второй перечисляет их по полу; это объект "ключ-значение", содержащий два списка.

Расширенные компоненты

Две особенности, которые отличают YAML от возможностей других языков сериализации данных, - это структуры и типизация данных.

Структуры YAML позволяют хранить несколько документов в одном файле, использовать ссылки для повторяющихся узлов и использовать произвольные узлы в качестве ключей.

Для ясности, компактности и предотвращения ошибок ввода данных, YAML предоставляет привязки узлов (с использованием и) и ссылки (с использованием *). Ссылки на якорь работают для всех типов данных (см. Ссылку на отправку в приведенном ниже примере).

Ниже приведен пример очереди в секвенсоре инструмента, в которой два шага повторно используются повторно, но каждый раз полностью не описываются.

--- # Протоколы секвенсора для лазерной хирургии глаза - шаг: id001 # определяет метку привязки id001 инструмент: Lasik 2000 pulse Энергия: 5,4 импульса Длительность: 12 повторений: 1000 точек Размер: 1 мм - шаг: id002 инструмент: Lasik 2000 pulse Энергия: 5,0 импульсов Длительность : 10 повторений: 500 размер пятна: 2 мм - шаг: * id001 # относится к первому шагу (с привязкой id001) - шаг: * id002 # относится ко второму шагу - шаг: * id002

Явный тип данных редко встречается в большинство документов YAML, поскольку YAML автоматически определяет простые типы. Типы данных можно разделить на три категории: основные, определенные и определяемые пользователем. Core - это те, которые, как ожидается, будут присутствовать в любом парсере (например, с плавающей точкой, целыми числами, строками, списками, картами,...). Многие более сложные типы данных, такие как двоичные данные, определены в спецификации YAML, но поддерживаются не во всех реализациях. Наконец, YAML определяет способ расширения определений типов данных локально, чтобы приспособить определяемые пользователем классы, структуры или примитивы (например, числа с плавающей точкой с точностью до четырех).

YAML автоматически определяет тип данных объекта, но иногда нужно явно указать тип данных. Наиболее распространенная ситуация - когда строка из одного слова, которая выглядит как число, логическое значение или тег, требует устранения неоднозначности путем заключения ее в кавычки или использования явного тега типа данных.

--- a: 123 # целое число b: "123" # строка, неоднозначная кавычками c: 123.0 # a float d: !! float 123 # также float через явный тип данных с префиксом (!!) e: !! str 123 # строка, неоднозначная с помощью явного типа f: !! str Yes # строка через явный тип g: Yes # логическое значение True (yaml1.1), строка "Yes" (yaml1.2) h: Да, у нас есть No bananas # строка «Да» и «Нет», неоднозначная по контексту.

Не каждая реализация YAML имеет каждый тип данных, определенный спецификацией. Эти встроенные типы используют префикс двойного восклицательного знака (!!). Особо интересными, не показанными здесь, являются наборы, упорядоченные карты, временные метки и шестнадцатеричные числа. Вот пример двоичных данных в кодировке base64.

--- изображение: !! двоичный | R0lGODdhDQAIAIAAAAAAANn Z2SwAAAAADQAIAAACF4SDGQ ar3xxbJ9p0qa7R0YxwzaFME 1IAADs =

Многие реализации YAML могут поддерживать определяемые пользователем типы данных для сериализации объектов. Локальные типы данных не являются универсальными типами данных, но определяются в приложении с помощью библиотеки анализатора YAML. Для локальных типов данных используется один восклицательный знак (!).

--- myObject:! MyClass {имя: Джо, возраст: 15}

Пример

Иерархия структуры данных поддерживается за счет отступов в структуре.

--- квитанция: Oz-Ware Purchase Invoice date: 2012-08-06 клиент: first_name: Dorothy family_name: Gale items: - part_no: A4786 descrip: Water Bucket (Filled) price: 1.47 количество: 4 - part_no: E1628 описание: Тапочки "Ruby" на высоком каблуке размер: 8 цена: 133.7 количество: 1 получатель: id001 улица: | 123 Tornado Alley Suite 16 город: Восточный Сентервилль штат: KS Место отправления: * id001 specialDelivery:>Следуйте по дороге из желтого кирпича в Изумрудный город. Не обращайте внимания на человека за занавесом....

Обратите внимание, что строки не требуют заключения в кавычки. Конкретное количество пробелов в отступе не имеет значения, пока параллельные элементы имеют одинаковое выравнивание по левому краю, а иерархически вложенные элементы имеют больший отступ. Этот образец документа определяет ассоциативный массив с 7 ключами верхнего уровня: один из ключей, «items», содержит список из 2 элементов, каждый элемент которого сам является ассоциативным массивом с разными ключами. Отображаются реляционные данные и удаление избыточности: содержимое ассоциативного массива «получатель» копируется из содержимого ассоциативного массива «получатель счета», как указано привязкой () и ссылкой (*) этикетки. Дополнительные пустые строки могут быть добавлены для удобства чтения. В одном файле / потоке может существовать несколько документов, которые разделяются ---. Необязательный ...может использоваться в конце файла (полезно для сигнализации об окончании потоковой передачи без закрытия канала).

Особенности

Разделение с отступом

Поскольку YAML в первую очередь полагается на отступ контура для структуры, он особенно устойчив к столкновению разделителя. Нечувствительность YAML к кавычкам и фигурным скобкам в скалярных значениях означает, что можно встраивать документы XML, JSON или даже YAML в документ YAML, просто сделав отступ в литерале блока (используя |или >):

--- пример:>HTML переходит в YAML без сообщения об изменении: | 

«Три всегда больше двух, даже для больших значений двух»

- Автор неизвестен

дата: 2007-06-01

YAML может быть помещается в JSON путем заключения и экранирования всех внутренних кавычек. YAML может быть помещен в XML путем экранирования зарезервированных символов (<, >, , ', ") и преобразования пробелов или путем помещения его в раздел CDATA.

Неиерархические модели данных

В отличие от JSON, который может представлять данные только в иерархической модели, где каждый дочерний узел имеет одного родителя, YAML также предлагает простую реляционную схему, которая позволяет повторять идентичные данные, на которые следует ссылаться из двух или более точек в дереве, а не вводиться повторно в этих точках. Это похоже на средство IDREF, встроенное в XML. Затем анализатор YAML расширяет эти ссылки в полностью заполненные структуры данных, которые они подразумевают при чтении, поэтому любая программа, использующая анализатор, не должна знать о реляционной модели кодирования, в отличие от процессоров XML, которые не расширяют ссылки. Это расширение может повысить удобочитаемость, уменьшив количество ошибок ввода данных в файлах конфигурации или протоколах обработки, где многие параметры остаются неизменными в последовательной серии записей, в то время как только некоторые изменяются. Примером может служить то, что записи «получатель» и «получатель счета» в счете-фактуре почти всегда являются одними и теми же данными.

Практические соображения

YAML ориентирован на строки, и поэтому часто бывает просто преобразовать неструктурированный вывод существующих программ в формат YAML, сохранив большую часть внешнего вида исходного документа. Поскольку нет закрывающих тегов, фигурных скобок или кавычек для балансировки, обычно легко сгенерировать правильно сформированный YAML непосредственно из распределенных операторов печати в простых программах. Точно так же разделители пробелов облегчают быструю и грязную фильтрацию файлов YAML с помощью строчно-ориентированных команд в grep, AWK, Perl, Ruby и Python.

В частности, в отличие от языков разметки, фрагменты последовательных строк YAML, как правило, сами являются правильно сформированными документами YAML. Это позволяет очень легко писать парсеры, которым не нужно полностью обрабатывать документ (например, балансировать открывающие и закрывающие теги и перемещаться по кавычкам и экранированным символам) до того, как они начнут извлекать определенные записи внутри. Это свойство особенно целесообразно при итерации за один проход без сохранения состояния по записям в файле, вся структура данных которого слишком велика для хранения в памяти, или для которых восстановление всей структуры для извлечения одного элемента было бы чрезмерно дорогостоящим.

Как ни странно, хотя его разделение с отступом может показаться усложнением глубоко вложенных иерархий, YAML обрабатывает отступы размером до одного пробела, и это может обеспечить лучшее сжатие, чем языки разметки. Кроме того, очень глубоких отступов можно полностью избежать: 1) вернуться к «встроенному стилю» (т.е. формату, подобному JSON) без отступов; или 2) использование реляционных якорей для преобразования иерархии в плоскую форму, которую синтаксический анализатор YAML прозрачно воссоздает в полную структуру данных.

Безопасность

YAML является исключительно языком представления данных и, следовательно, не имеет исполняемых команд. Хотя проверка и безопасный синтаксический анализ по своей сути возможны на любом языке данных, реализация является настолько печально известной ловушкой, что отсутствие связанного командного языка YAML может быть относительным преимуществом безопасности.

Однако YAML допускает языковые теги, так что произвольные локальные объекты могут быть созданы парсером, который поддерживает эти теги. Любой синтаксический анализатор YAML, который позволяет выполнять сложные экземпляры объектов, открывает возможность для атаки путем внедрения. Парсеры Perl, позволяющие загружать объекты произвольных классов, создают так называемые «благословенные» значения. Использование этих значений может вызвать неожиданное поведение, например если в классе используются перегруженные операторы. Это может привести к выполнению произвольного кода Perl.

Ситуация аналогична для парсеров Python или Ruby. Согласно документации PyYAML:

Обратите внимание, что возможность создания произвольного объекта Python может быть опасной, если вы получаете документ YAML из ненадежного источника, такого как Интернет. Функция yaml.safe_loadограничивает эту возможность простыми объектами Python, такими как целые числа или списки. [...]

PyYAML позволяет создавать объект Python любого типа. Даже экземпляры классов Python могут быть созданы с помощью тега !! python / object.

Обработка и представление данных

Спецификация YAML идентифицирует экземплярный документ как «презентацию» или «поток символов». Первичные логические структуры в документе экземпляра YAML - это скаляры, последовательности и отображения. Спецификация YAML также указывает некоторые основные ограничения, которые применяются к этим первичным логическим структурам. Например, согласно спецификации, ключи сопоставления не имеют порядка. В каждом случае, когда порядок узлов имеет значение, необходимо использовать последовательность.

Более того, при определении соответствия для процессоров YAML спецификация YAML определяет две основные операции: дамп и загрузку. Все YAML-совместимые процессоры должны обеспечивать по крайней мере одну из этих операций, а при необходимости могут предоставлять обе. Наконец, спецификация YAML определяет информационную модель или «граф представления», который должен быть создан во время обработки как для операций дампа, так и для операций загрузки, хотя это представление не обязательно должно быть доступно пользователю через API.

Сравнение с другими форматами сериализации

Сравнение с JSON

Синтаксис JSON является основой YAML версии 1.2, которая была обнародована с явной целью приведения YAML «в соответствие с JSON в качестве официального подмножества». Хотя предыдущие версии YAML не были строго совместимы, расхождения редко были заметны, и большинство документов JSON можно было проанализировать некоторыми синтаксическими анализаторами YAML, такими как Syck. Это связано с тем, что семантическая структура JSON эквивалентна необязательному «встроенному стилю» написания YAML. Хотя расширенные иерархии могут быть написаны во встроенном стиле, таком как JSON, это не рекомендуемый стиль YAML, за исключением случаев, когда он способствует ясности.

YAML имеет множество дополнительных функций, которых не хватает в JSON, включая комментарии, расширяемые типы данных, реляционные привязки, строки без кавычек и типы сопоставления, сохраняющие порядок ключей.

Сравнение с TOML

С одной стороны, YAML намного сложнее по сравнению с TOML - указано, что спецификация YAML содержит 23 449 слов, тогда как спецификация TOML было всего 3339 слов.. С другой стороны, YAML менее подробный, более СУХИЙ, синтаксически менее шумный, а иерархия документа очевидна по отступам.

Сравнение с XML

В YAML отсутствует понятие атрибутов тегов, которые можно найти в XML. Вместо этого YAML имеет расширяемые объявления типов (включая типы классов для объектов).

Сам YAML не имеет определяемых языком дескрипторов схемы документа XML, которые позволяют, например, самопроверку документа. Однако существует несколько внешне определенных языков дескрипторов схемы для YAML (например, Doctrine и Rx), которые выполняют эту роль. Более того, семантика, предоставляемая объявлениями типов, определяемых языком YAML, в самом документе YAML часто снижает потребность в валидаторе в простых, распространенных ситуациях. Кроме того, который представляет структуры данных YAML в XML, позволяет применять к YAML импортеры схемы XML и механизмы вывода, такие как XSLT.

Программное обеспечение (эмиттеры и парсеры)

Для фиксированных структур данных файлы YAML могут быть просто сгенерированы с использованием команд печати, которые записывают как данные, так и специальное оформление YAML. Однако для выгрузки различных или сложных иерархических данных предпочтительнее использовать специальный эмиттер YAML. Точно так же простые файлы YAML (например, пары ключ-значение) легко анализируются с помощью регулярных выражений. Для более сложных или разнообразных структур данных рекомендуется формальный синтаксический анализатор YAML.

Эмиттеры и парсеры YAML существуют для многих популярных языков. Большинство из них написано на самом родном языке. Некоторые из них являются языковыми привязками библиотеки C libyaml; они могут бежать быстрее. Раньше существовала еще одна библиотека C, называемая Syck, написанная и осиротевшая , почему этот счастливчик : она не обслуживается, отсутствует авторитетный исходный пакет и веб-сайт был взломан. Следовательно, единственная рекомендуемая библиотека C - это libyaml. Первоначально он был разработан Кириллом Симоновым. В 2018 году разработка была возобновлена ​​новыми сопровождающими Яном Кордаско и.

программисты на C ++ могут выбирать между библиотекой C libyaml и библиотекой C ++ libyaml-cpp. Оба имеют полностью независимые кодовые базы и совершенно разные API. Библиотека libyaml-cpp по-прежнему имеет основной номер версии 0, что означает, что API может измениться в любой момент, как это действительно произошло после версии 0.3. Существует реализация, ориентированная на грамматику, написанная на C # с целью расширения для вложенных элементов.

Некоторые реализации YAML, такие как Perl YAML.pm, загружают весь файл (поток) и анализируют его. массово. Другие реализации, такие как PyYaml, ленивы и перебирают следующий документ только по запросу. Для очень больших файлов, в которых планируется обрабатывать документы независимо, создание экземпляра всего файла перед обработкой может быть недопустимым. Таким образом, в YAML.pm иногда нужно разбивать файл на документы и анализировать их по отдельности. YAML упрощает это, поскольку для этого просто требуется разделение маркера конца документа, который определяется как три точки в отдельной строке. Этот маркер запрещен в содержании.

Критика

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

  • Файлы конфигурации могут выполнять команды или загружать содержимое без ведома пользователя.
  • Редактирование больших файлов YAML затруднено, поскольку ошибки отступа могут остаться незамеченными.
  • Автоопределение типа является источником ошибок. Например, Даи NOбез кавычек преобразуются в логические, номера версий программного обеспечения могут быть преобразованы в числа с плавающей запятой.
  • Усеченные файлы часто интерпретируются как допустимый YAML из-за отсутствие терминаторов.
  • Сложность стандарта привела к несогласованным реализациям и сделала язык непереносимым.

Предполагаемые недостатки и сложность YAML привели к появлению StrictYAML, который использует ограниченное подмножество спецификации YAML.

См. также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-22 08:52:02
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте