Yml спецификация: Описание формата YML

Содержание

Спецификация файла Yml — Русские Блоги

оригинал:https://www.cnblogs.com/BlogNetSpace/p/8444861.html

1. Познакомьтесь с YAML

YAML (произносится / ˈjæməl /) — это язык сериализации данных, похожий на XML и JSON. Он подчеркивает ориентированность на данные и предназначен для удобного использования человеком, и это современный язык программирования, подходящий для повседневных общих задач. Таким образом, само определение YAML является относительно простым, известным как «язык гуманизированных форматов данных».

1.1 Цели разработки YAML:

  • Люди легко читаются

  • Может использоваться для обмена данными между различными программами

  • Подходит для описания структур данных, используемых программами, особенно языками сценариев

  • Богатая выразительная мощь и масштабируемость

  • Легко использовать

1.2 YAML и XML, JSON

1.3 YAML организационная структура

Файлы YAML могут состоять из одного или нескольких документов (то есть относительно независимой организационной структуры), используемых между документами. “—”(Три горизонтальные линии), используемые в качестве разделителей в начале каждого документа. В то же время в документе также можно использовать «…» (три точки) в качестве терминатора (необязательно). Как показано ниже:

 

  • Если это только один документ, разделитель «—» может быть опущен.

  • В каждом документе не обязательно использовать конечный символ «…» для обозначения конца, но для сетевой передачи или потоковой передачи, как чистый конечный символ, он способствует программной обработке. (Например, вам не нужно знать, что поток закрыт, чтобы узнать конец документа) <br/>

YAML считает, что данные состоят из следующих трех структур: (каждый документ состоит из смеси трех структур)

  • Скалярное (эквивалентно типу данных)

  • Последовательность (эквивалентная массивам и спискам)

  • Таблица ключ-значение (эквивалент таблицы таблиц)

2. Технические условия написания YAML

Основные правила грамматики:

1) чувствителен к регистру

2) Используйте отступ для представления иерархических отношений

3) Клавиша Tab не допускается при отступе, допускаются только пробелы.

4) Количество отступов не имеет значения, если элементы одного уровня выровнены по левому краю

 

  • Спецификация 1:В документе в качестве стандартной кодировки символов используется кодировка Unicode, например UTF-8.

  • Спецификация два:Используйте «#» для обозначения комментариев

    # Заказ покупателя
    date: 2015-02-01
    customer:
      - name: Jai
    items:
         -№: 1234 # номер заказа
      - descript: cpu
    
  • Спецификация 3:Используйте пробелы в качестве вложенного инструмента для отступов. Обычно рекомендуется использовать два пробела для отступов, а табуляции не рекомендуется (даже не поддерживается)

  • Спецификация 4:Представление последовательности

    • Используйте «-» (горизонтальная линия) + один пробел для обозначения одного элемента списка
      --- # начало документа
       -Глава 1 Введение
       -Глава 2 Каталог Дизайна
      
    • Используйте «[]» для представления набора данных
      --- # начало документа
      [blue, red, green]
      
    • Комбинированное представление. Каждая структура может быть вложенной для формирования сложной структуры представления.
      --- # начало документа
       - [синий, красный, зеленый] # Сам элемент списка также является списком
      - [Age, Bag]
       -site: {osc: www.oschina.net, baidu: www.baidu.com} # Вот то же самое представление комбинации таблицы ключ-значение
  • Спецификация 5:Таблица ключ-значение

    • Используйте «:» (двоеточие) + пробел, чтобы указать одну пару ключ-значение
      # Заказ покупателя
      date: 2015-02-01
      customer:
        - name: Jai
      items:
           -№: 1234 # номер заказа
        - descript: cpu
        - price: ¥800.00
      
    • Используйте «{}» для представления таблицы ключ-значение
      # Заказ покупателя
      date: 2015-02-01
      customer:
        - name: Jai
      items: {no: 1234, descript: cpu, price: ¥800.00}
      
    • «?» Знак вопроса + пробел указывает на сложный ключ. Когда ключ является списком или таблицей ключ-значение, вам необходимо использовать этот символ для маркировки.
        # Используйте список в качестве ключа
       ? [blue, reg, green]: Color
         # Эквивалентно
       ? - blue
         - reg
         - gree
       : Color
      
    • Комбинированное представление. Каждая структура может быть вложенной для формирования сложной структуры представления.

       Color:
          - blue
          - red
          - green
         # Эквивалент (также представление JSON)
       {Color: [blue, red, green]}
       div:
          - border: {color: red, width: 2px}
          - background: {color: green}
          - padding: [0, 10px, 0, 10px]
         # Таблицы ключ-значение и элементы списка, представленные отступом
       items:
          - item: cpu
            model: i3
            price: ¥800.00
          - item: HD
            model: WD
            price: ¥450.00
         # Выше используется "-", ведущий и отступ для обозначения нескольких элементов списка, эквивалентный следующему JSON
       items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]
      
  • Спецификация 6:Текстовый блок

    • Используйте «|» и текстовое содержимое для отступа блока: сохраните существующий возврат каретки и перевод строки в блоке. Эквивалент блока абзаца

      yaml: | # Обратите внимание на пробел между ":" и "|"
             Синтаксис JSON на самом деле является подмножеством YAML, и большинство файлов JSON могут интерпретироваться интерпретаторами YAML.
         
    • Используйте «>» и текстовое содержимое для отступа блока: замените возврат каретки пробелом в блоке и, наконец, соедините его в строку.

      yaml:> # Обратите внимание на пробел между ":" и ">", вы также можете использовать пустые строки для разделения абзацев
             Синтаксис JSON на самом деле является подмножеством YAML,
             Большинство файлов JSON могут интерпретироваться интерпретатором YAML.
      
    • Используйте разделитель «» (двойные кавычки), ‘'(одинарные кавычки) или возврат каретки для обозначения блока: в конечном итоге выражается в виде строки.

      yaml: # Используйте несколько строк возврата каретки и, наконец, соедините их в одну строку.
             Синтаксис JSON на самом деле является подмножеством YAML,
             Большинство файлов JSON могут интерпретироваться интерпретатором YAML. 
       yaml: # Используются двойные кавычки. Преимущество двойных кавычек в том, что их можно экранировать, то есть специальные символы можно использовать внутри.
             «Синтаксис JSON на самом деле является подмножеством YAML,
             Большинство файлов JSON могут интерпретироваться интерпретатором YAML. "
      
  • Спецификация 7:Соглашения о типе данных

    • Был согласован формат представления некоторых распространенных типов данных, в том числе:

        целое число: 12345 # стандартная форма целого числа
         восьмеричное: 0o34 # восьмеричное представление, вторая буква o
         hex: 0xFF # шестнадцатеричное представление
         float: 1.23e + 3 # с плавающей точкой
         исправлено: 13.67 # фиксированное десятичное число
         minmin: -.inf # означает отрицательную бесконечность
         notNumber: .NaN # неверный номер
         null: # нулевое значение
         логическое: [true, false] # логическое
         строка: '12345' # строка
         дата: 2015-08-23 # дата
         datetime: 2015-08-23T02: 02: 00. 1z # дата время
         iso8601: 2015-08-23t21: 59: 43.10-05: 00 # iso8601 формат даты
       spaced: 2015-08-23 21:59:43.10 -5      # ?
      
    • «!» (восклицательный знак) явно указывает тип или пользовательскую идентификацию типа. Одиночный восклицательный знак обычно является пользовательским типом, двойной восклицательный знак — встроенным

       isString: !! str 2015-08-23 # Подчеркните, что строка не является данными даты
         картинка: !! binary | # Base64 картинка
           R0lGODlhDAAMAIQAAP//9/X
           17unp5WZmZgAAAOfn515eXv
           Pz7Y6OjuDg4J+fn5OTk6enp
           56enmleECcgggoBADs=
         # Вот встроенные типы
         !! int # целочисленный тип
         !! float # Тип с плавающей точкой
         !! bool # Булев тип
         !! str # Тип строки
         !! двоичный # также является строковым типом
         !! timestamp # Тип даты и времени
         !! null # Нулевое значение
         !! набор # коллекция
         !! omap, !! pair # список значений ключей или список объектов
         !! seq # Sequence, также список
         !! map # Таблица значений ключей
         #Вот несколько примеров:
       --- !!omap
       - Mark: 65
       - Sammy: 63
       - Key: 58
         --- !! set # Обратите внимание, что «?» означает, что ключ является списком, здесь список является нулевым
       ? Mark
       ? Sammy
       ? Key
         # Ниже приведен пользовательский тип или логотип
         % TAG! Tag: clarkevans. com, 2002: #% - символ инструкции
       --- !shape
       # Use the ! handle for presenting
       # tag:clarkevans.com,2002:circle
       - !circle
         center: &ORIGIN {x: 73, y: 129}
         radius: 7
       - !line
         start: *ORIGIN
         finish: { x: 89, y: 102 }
       - !label
         start: *ORIGIN
         color: 0xFFEEBB
         text: Pretty vector drawing.
      
  • Спецификация 8:Точки привязки и ссылки определяют повторное использование данных.

 

 


Интеллектуальная рекомендация

Управление логами под linux

I. Аудит входа пользователя   1. Просмотр авторизованной информации о пользователе 1) w Просмотр пользователей, которые используют текущую систему 2) w -f -f —- — — — — — — ———…

5.1 В рамках New Deal Express Cainiao быстро запустил «новые виды»

25 мая Cainiao официально выпустила «новый вид» в индустрии экспресс-доставки: небольшая коробка Cainiao — установка от двери до двери, нулевое расстояние от двери дома, курьерская служба . ..

Ubuntu 16.04lts Установка cudnn

https://developer.nvidia.com/cudnn Регистрация и анкеты частично опущены Скачать библиотеку cudnn v7.0.4 для Linux Не Ubuntu 16.04 После загрузки: CD ~/скачать   tar zxvf cudnn-9.0-linux-x64-v7.t…

zcmu — 1018: штурм

1018: штурм Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 922  Solved: 320 [Submit][Status][Web Board] Description У вас есть n подчиненных, и каждый подчиненный должен выполнить…

iOS реализует запись видео, синтез видео и звука.

1. Граница В проекте необходимо реализовать запись тихого маленького видео, а затем записать звук на основе немого маленького видео. Во-вторых, общие шаги Запись небольшого тихого видео (со звуком или…

Вам также может понравиться

Исследование Springcloud- (3) Поставщик регистрации в Eureka

Цель: Разработайте два модуля поставщика серверов, чтобы зарегистрировать модуль поставщика услуг в кластере услуг Eureka. шаг: 1. Создать Springboot Modle Project SpringBootProvider1, SpringBootProvi. ..

Реализация пейджинга

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

Один столбец списка данных перехватывает десятку плюс … Наведите курсор мыши, чтобы показать все

 …

Python-GUI(GraphicalUserInterface)(1)

Графический интерфейс в python имеет-Tkinter, wxPython, PyQt Tkinter-bound — это набор инструментов TK GUI, который использует код tcl, завернутый в Python. Альтернатива PyGTK-Tkinter кросс-платформа …

JDK1.8 Скачать установку (версия Windows)

Первый шаг установлен с официального сайта JDK JDK Скачать адрес на Oracle:https://www.oracle.com/technetwork/java/javase/downloads/index.html В соответствии с вашими собственными потребностями, я выб…

10 шагов к YAML-дзену / Хабр

Мы все любим Ansible, но Ansible – это YAML. Для конфигурационных файлов существует масса форматов: списки значений, пары «параметр-значение», INI-файлы, YAML, JSON, XML и множество других. Однако по нескольким причинам из всех них YAML часто считается особенно трудным. В частности, несмотря на его освежающий минимализм и впечатляющие возможности для работы с иерархическими значениями, синтаксис YAML может раздражать своим Python-образными подходом к отступам.

Если вас бесит YAML, вы можете – и должны! – предпринять 10 следующих шагов, чтобы снизить свое раздражение до приемлемого уровня и полюбить YAML. Как и положено настоящему списку, наша десятка советов будет нумероваться с нуля, медитацию и духовные практики добавляем по желанию 😉

0. Заставьте ваш редактор работать


Неважно, какой у вас текстовый редактор – для него наверняка существует хотя бы один плагин для работы с YAML. Если у вас такого нет, немедленно найдите и установите. Потраченное на поиск и настройку время будет многократно окупаться каждый раз, когда вам придется редактировать YAML.

Например, редактор Atom поддерживает YAML по умолчанию, а вот для GNU Emacs придется установить дополнительные пакеты, например, yaml-mode.

Emacs в режиме YAML и отображения пробелов.

Если в вашем любимом редакторе нет режима YAML, то часть проблем можно решить, поработав с настройками. Например, штатный для GNOME текстовый редактор Gedit не имеет режима YAML, но по умолчанию подсвечивает синтаксис YAML и позволяет настроить работу с отступами:

Настройка отступов в Gedit.

А плагин drawspaces для Gedit отображает пробелы в виде точек, устраняя неясности с уровнями отступа.

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

1. Используйте линтер (linter)


В идеале языки программирования и языки разметки используют предсказуемый синтаксис. Компьютеры хорошо справляются с предсказуемостью, поэтому еще в 1978 году возникла концепция линтера. Если за 40 лет своего существования она прошла мимо вас и вы до сих пор не пользуетесь YAML-линтером, то самое время попробовать yamllint.

Установить yamllint можно с помощью штатного менеджера пакетов Linux. Например, в Red Hat Enterprise Linux 8 или Fedora это делается так:

$ sudo dnf install yamllint


Затем вы просто запускаете yamllint, передавая ему YAML-файл для проверки. Вот как это выглядит, если передать линтеру файл с ошибкой:

$ yamllint errorprone.yaml
errorprone.yaml
23:10     error    syntax error: mapping values are not allowed here
23:11     error    trailing spaces  (trailing-spaces)


Цифры слева – это не время, а координаты ошибки: номер строки и столбца. Описание ошибки может вам ни о чем не говорить, зато вы точно знаете, где она находится. Просто посмотрите на это место в коде, и, скорее всего, все станет ясно.

Когда yamllint не находит ошибок в файле, на экран ничего не выводится. Если вас пугает такая тишина и хочется немного больше обратной связи, то можно запускать линтер с условной командой echo через двойной амперсанд (&&), вот так:

$ yamllint perfect.yaml && echo "OK"
OK


В POSIX двойной амперсанд срабатывает тогда и только тогда, когда предшествующая команда возвращает 0. А yamllint как раз возвращает количество найденных ошибок, поэтому вся эта условная конструкция и работает.

2. Пишите на Python, а не на YAML


Если вас реально бесит YAML, просто не пишите на нем, в буквальном смысле. Бывает, что YAML – это единственный формат, который воспринимается приложением. Но и в этом случае необязательно создавать YAML-файл. Пишите на том, что вам нравится, а потом конвертируйте. Например, для Python есть отличная библиотека pyyaml и целых два способа конвертирования: самоконвертирование и конвертирование через скрипты.

Самоконвертирование


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

#!/usr/bin/python3	
import yaml 
d={
"glossary": {
  "title": "example glossary",
  "GlossDiv": {
	"title": "S",
	"GlossList": {
	  "GlossEntry": {
		"ID": "SGML",
		"SortAs": "SGML",
		"GlossTerm": "Standard Generalized Markup Language",
		"Acronym": "SGML",
		"Abbrev": "ISO 8879:1986",
		"GlossDef": {
		  "para": "A meta-markup language, used to create markup languages such as DocBook.",
		  "GlossSeeAlso": ["GML", "XML"]
		  },
		"GlossSee": "markup"
		}
	  }
	}
  }
}
f=open('output.yaml','w')
f.write(yaml.dump(d))
f.close


Теперь запускаем это файл на Python-е и на выходе получаем файл output. yaml:

$ python3 ./example.json
$ cat output.yaml
glossary:
  GlossDiv:
	GlossList:
	  GlossEntry:
		Abbrev: ISO 8879:1986
		Acronym: SGML
		GlossDef:
		  GlossSeeAlso: [GML, XML]
		  para: A meta-markup language, used to create markup languages such as DocBook.
		GlossSee: markup
		GlossTerm: Standard Generalized Markup Language
		ID: SGML
		SortAs: SGML
	title: S
  title: example glossary


Это абсолютно корректный YAML, но yamllint выдаст предупреждение, что он не начинается с —. Что ж, это можно легко поправить вручную или слегка доработать Python-скрипт.

Конвертирование через скрипты


В этом случае сначала пишем на JSON-е, а затем запускаем конвертор в виде отдельного Python-скрипта, который на выходе дает YAML. По сравнению с предыдущим этот способ лучше масштабируется, поскольку конвертирование отделено данных.

Для начала создадим JSON-файл example.json, например, его можно взять на json. org:

{
	"glossary": {
	  "title": "example glossary",
	  "GlossDiv": {
		"title": "S",
		"GlossList": {
		  "GlossEntry": {
			"ID": "SGML",
			"SortAs": "SGML",
			"GlossTerm": "Standard Generalized Markup Language",
			"Acronym": "SGML",
			"Abbrev": "ISO 8879:1986",
			"GlossDef": {
			  "para": "A meta-markup language, used to create markup languages such as DocBook.",
			  "GlossSeeAlso": ["GML", "XML"]
			  },
			"GlossSee": "markup"
			}
		  }
		}
	  }
	}


Затем создадим простой скрипт-конвертор и сохраним его под именем json2yaml.py. Этот скрипт импортирует оба модуля — YAML и JSON Python, а также загружает указанный пользователем файл JSON, выполняет конвертирование и пишет данные в файл output.yaml.

#!/usr/bin/python3
import yaml
import sys
import json
OUT=open('output.yaml','w')
IN=open(sys.argv[1], 'r')
JSON = json.load(IN)
IN.close()
yaml.dump(JSON, OUT)
OUT.close()


Сохраните этот скрипт в system path и запускайте по мере необходимости:

$ ~/bin/json2yaml. py example.json

3. Парсите много и часто


Иногда на проблему полезно взглянуть под другим углом. Если вам трудно представить взаимосвязи между данными в YAML, можно временно преобразовать их в нечто более привычное.

Например, если вам удобно работать со словарными списками или с JSON, то YAML можно преобразовать в JSON всего двумя командами в интерактивной оболочке Python. Допустим, у вас есть YAML-файл mydata.yaml, тогда вот как это будет выглядеть:

$ python3
>>> f=open('mydata.yaml','r')
>>> yaml.load(f)
{'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Road\n', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'Good article. Could be better.'}


На эту тему можно найти массу других примеров. Кроме того, в наличии множество онлайн-конвертеров и локальных парсеров. Так что не стесняйтесь переформатировать данные, когда видите в них только непонятную мешанину.

4. Читайте спеки


Возвращаясь к YAML после долгого перерыва, полезно зайти на yaml.org и перечитать спецификации (спеки). Если у вас трудности с YAML, но до спецификации руки так и не дошли, то пора эту ситуацию исправлять. Спеки на удивление легко написаны, а требования к синтаксису иллюстрируются большим количеством примеров в Главе 6.

5. Псевдоконфиги


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

Псевдоконфиг похож на псевдокод, где не надо заботиться о структуре или отступах, отношениях «родитель-потомок», наследовании и вложенности. Так и здесь: вы рисуете итерации данных по мере того, как они возникают у вас в голове.

Псевдоконфиг с перечислением программистов (Martin и Tabitha) и их навыков (языков программирования: Python, Perl, Pascal и Lisp, Fortran, Erlang, соответственно).

Нарисовав псевдоконфиг на листе бумаги, внимательно проанализируйте его и, если все в порядке, оформите в виде валидного YAML-файла.

6. Дилемма «табуляция или пробелы»


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

В любом нормальном текстовом редакторе можно настроить автозамену табуляции на заданное количество пробелов, поэтому бунта приверженцев клавиши Tab можно не бояться.

Как хорошо известно каждому ненавистнику YAML, на экране не видно разницы между табуляцией и пробелами. А когда чего-то не видно, об этом, как правило, вспоминают в последнюю очередь, после того, как перебрали, проверили и устранили все остальные возможные проблемы. Час времени, убитый на поиск кривой табуляции или блока пробелов, просто вопиет о том, что вам над срочно создать политику использования того или другого, а затем реализовать железобетонную проверку ее соблюдения (например, через Git-хук для принудительного прогона через линтер).

7. Лучше меньше да лучше (или больше – это меньше)


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

Вот пример такой структурированности из документации Ansible:

# Employee records
-  martin:
        name: Martin D'vloper
        job: Developer
        skills:
            - python
            - perl
            - pascal
-  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
            - lisp
            - fortran
            - erlang


Кому-то такой вариант помогает разложить в голове структуру YAML, других он наоборот раздражает массой ненужных, на их взгляд, отступов.

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

---
- martin:
   name: Martin D'vloper
   job: Developer
   skills:
   - python
   - perl
   - pascal
- tabitha:
   name: Tabitha Bitumen
   job: Developer
   skills:
   - lisp
   - fortran
   - erlang

8.

Используйте заготовки


Если при заполнении файла YAML вы постоянно повторяете одни и те же ошибки, имеет смысл вставить в него шаблон-заготовку в виде комментария. Тогда в следующий раз можно будет просто скопировать эту заготовку и вписать туда реальные данные, например:

---
# - <common name>:
#   name: Given Surname
#   job: JOB
#   skills:
#   - LANG
- martin:
  name: Martin D'vloper
  job: Developer
  skills:
  - python
  - perl
  - pascal
- tabitha:
  name: Tabitha Bitumen
  job: Developer
  skills:
  - lisp
  - fortran
  - erlang

9. Используйте что-то другое


Если приложение не держит вас мертвой хваткой, то, возможно, стоит сменить YAML на другой формат. Со временем конфигурационные файлы могут перерастать себя и тогда лучше преобразовать их в простые скрипты на Lua или Python.

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

Если же без YAML никак не обойтись, то возьмите на вооружение эти 10 советов и победите свою неприязнь к YAML раз и навсегда!

YAML(tm) — еще один язык разметки


Добро пожаловать в YAML ™ — РАБОЧИЙ ПРОЕКТ 0.19a

Это первый серьезный рабочий проект YAML.


Ключевые понятия

YAML основан на нескольких ключевых концепциях очень
успешные языки.

  • YAML использует структуру типов, аналогичную Perl. В ЯМЛ,
    там есть три фундаментальные структуры: скаляры ($),
    карты (%) и списки (@). YAML также поддерживает ссылки на
    включить сериализацию графиков. Более того,
    каждое значение данных может быть связано с именем класса
    чтобы разрешить использование определенных типов данных.
  • YAML использует область видимости блока, аналогичную Python. В ЯМЛ,
    степень узла указывается его дочерним
    уровень вложенности, т. е. в каком столбце он находится. Блок
    отступ обеспечивает удобство просмотра документа
    структура, которая помогает идентифицировать ошибки области.
  • YAML использует ту же обработку пробелов, что и HTML. В
    YAML, последовательности пробелов, табуляции и возврата каретки
    символы складываются в один пробел во время синтаксического анализа.
    Эта замечательная техника делает код разметки читаемым
    включение отступов и переноса слов, не затрагивая
    Каноническая форма содержания.
  • YAML использует escape-последовательности в стиле косой черты, аналогичные C.
    В YAML \n используется для представления новой строки, \t используется для
    представляет вкладку, а \\ используется для представления косой черты.
    Кроме того, поскольку пробелы складываются, YAML использует bash
    стиль «\», чтобы избежать дополнительных пробелов, которые являются частью
    содержание и не должны быть свернуты. Наконец, трейлинг
    \ используется как маркер продолжения, позволяя
    содержимое должно быть разбито на несколько строк без
    введение нежелательных пробелов.
  • YAML позволяет
    rfc822
    совместимая область заголовка для комментариев, специальная обработка
    инструкции и объявления кодирования. Это обеспечивает
    гибкий и перспективный метод увеличения
    Парсер YAML с другими функциями, такими как валидатор
    аналогично TREX или RELAX. Кроме того, это позволит
    система обработки почты для прямого использования YAML в качестве
    входной парсер.
  • YAML поддерживает двоичные и форматированные текстовые объекты с
    MIME
    многокомпонентные вложения. Каждому приложению дается
    идентификатор ссылки, который может быть связан с
    расположение в иерархическом содержимом YAML. Это позволяет
    конечные значения, которые нарушили бы встроенную структурную
    поток должен обрабатываться отдельно в отдельном блочном механизме.
  • YAML имеет SAX
    как последовательный API «C». Эту библиотеку C можно использовать для
    легко создавать представления YAML на родном языке
    сериализация. API также демонстрирует умные случаи
    метод заменяемости, который позволяет изменять схему
    происходить в листовых узлах в обратно совместимом
    образом, не нарушая старый код. Это придает устойчивость
    к более старому коду, позволяя структуру ваших данных
    расти со временем.

Пример: Базовый

Ниже приведен пример счета, выраженного с помощью YAML.
Тип каждого значения обозначается либо процентами (карта), либо
знак at (список) или необязательный знак доллара (скаляр).
Содержимое каждого значения следует за индикатором либо
на той же строке для скаляров или на последующих с отступом
линии. Содержимое карты, которая также является стартовой
производство, представляет собой список ключевого значения париж. Каждый ключ и
значения разделяются двоеточием.

покупатель : %
    адрес     : %
       город: Роял Оук
       первая строка: 458 Путь Виттигена
       вторая строка: Люкс № 292
       почтовый : 48046
       состояние: Ми
    фамилия: Думарс
    имя: Крис
Дата: 12 января 2001 г. 
Комментарии :
    Мистер Дюмарс часто отсутствует по утрам
    поэтому лучше всего попробовать что-то в конце
    после полудня. \nЕсли Джо нет рядом, попробуйте его дом\
    вратарь Нэнси Биллсмер @ (734) 338-4338.\n
Доставка : %
    способ : UZS Express Ночной
    цена : 45.50
счет : 00034843
товар : @
    %
        desc : Класс A, баскетбольный мяч из кожи
        идентификатор: BL394D
        цена : 450.00
        количество : 4
    %
        desc : Super Hoop (tm)
        идентификатор: BL4438H
        цена : 2,392.00
        количество : 1
налог : 0.00
всего: 4237,50
 

Поскольку «продукт» — это список, он имеет только значения и, следовательно,
отсутствует ключ и двоеточие. Также обратите внимание, что
Скаляр «комментарии» находится на нескольких строках. Поскольку пробел
складывается, возврат каретки (\n) экранируется и
окончание строки \ требуется для сохранения домработницы как
одно слово. По умолчанию сериализатор будет
сортировать ключи карты, хотя это не является обязательным требованием
структуры сериализации.


Пример: ссылки и имена классов

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

покупатель : %человек
    Комментарии :
        Это доступный объект человека
        через ключ "покупатель" из
        карта верхнего уровня.
    фамилия: Думарс
    имя: Крис
встроенный: $(0001)
    Это свернутый текстовый объект
    что связано с
    ссылка, так что это может быть
    повторно использованы позже. 
продавец: %person(0002)
    Комментарии:
        Это объект другого человека, только
        что ему присвоен дескриптор 0001 как
        а также класс, так что это может быть
        упоминается позже. Ручки должны быть
        числовой, и классы не могут начаться
        с номером.
    Фамилия : Продавцы
    имя: Питер
ззз :
   Комментарии:
       Первые два элемента на этой карте являются ссылками
       Первый — это объект человека «Питер Селлерс».
       Второй — к встроенному текстовому объекту «Это…».
       Скаляр цены ниже имеет класс «цена».
   Питер: *(0002)
   цена : $валюта
       23.34
   текст: *(0001)
 

Пример: ссылки на блоки и вложения

Ниже приведен пример документа YAML, который включает
необязательный заголовок стиля rfc822, в частности
Составной заголовок rfc2046. Парсер YAML должен обрабатывать
эти заголовки, чтобы обеспечить обработку для конкретного приложения
инструкции и MIME для необработанных/двоичных ссылок.

Дата: Воскресенье, 13 мая 2001 г., 23:48:04 -04:00
MIME-версия: 1.0
Content-Type: multipart/related;
    граница="================================"
X-YAML-Версия: 1.0
--=================================
Content-Type: текстовый/обычный;
  ХХ ХХХ ХХХХХ ХХ ХХ
   ХХХ ХХ Х ХХ Х ХХ
   ХХ ХХХХХ ХХ Х ХХ
   ХХ Х ХХ ХХХХХХХХ
  ХХХ ХХХХХ Х ХХ ХХ
--=================================
Content-Type: изображение/gif;
Контент-передача-кодирование: base64
R0lGODlhGQAPAOMAAAICBDaanAJSVAISFP7+/GbOzAJmZAIeHGbMzGbMzGbMzGbMzGbMzGbMzGbM
zGbMzCH+Dk1hZGUgd2l0aCBHSU1QACH5BAEKAAYALAAAAAZAA8AQAR70EgZArlBWHw7Nts1gB6R
GV0wCBMlkp4qlHJppkNoyW1r5SmcTeV6wUwrFI4VEulSMyRLchHYrYLq4MDKYrm9СУФКИЗЛХАЛА
pm6VV+g44FBSHybokQGdnivNfhJ8enwFSR12eB4jcWZ3gHeCJQJycXSJEzaIc5SIWz0RADs=
--=================================
Content-Type: text/x-yaml;
встроенный: $(0004)
    Это свернутый текстовый объект
    что связано с
    ссылка.
содержание :
   комментарий:
       Циклический элемент является ссылкой
       на карту верхнего уровня. 
   циклический: *(0003)
   изображение: *(0002)
   встроенный: *(0004)
   необработанный: *(0001)
   title : содержит несколько ссылок
 

Информационная модель

Карта/список/скалярные структуры данных, найденные в
современные языки программирования, такие как ML,
Python, Perl и C. Эта модель также должна
быть очень совместимым с реляционной базой данных
столы. Примечание. В этой модели отсутствуют классы и
ссылки, которые все еще находятся на рассмотрении.

Документ Начальным продуктом для YAML является карта.
Карта Неупорядоченная последовательность из нуля или более
(Ключ, Значение) кортежи. Где они ключ
уникален в последовательности и соответствует
Ключевое производство.
Значение Точно один из Scalar, Map или List
List Упорядоченная последовательность из нуля или более значений.
Скаляр Любой тип, который может быть непосредственно сериализован или может быть
составленный из последовательности из нуля или более символов.
Эти символы должны соответствовать Char
производство.

По умолчанию Это синтезированный атрибут каждого значения. Если
Значение является скаляром, тогда свойство по умолчанию
относится к самому значению. Если это значение является списком,
то значение по умолчанию относится к свойству по умолчанию
первое значение в своей последовательности. Если значение является картой,
то значение по умолчанию относится к свойству по умолчанию
Значение в записи Pair без ключа. Используя
По умолчанию скалярное значение можно заменить на
Map или List Value без торможения старого кода.

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


Сопоставление с популярными средами

Для Python внутреннее представление имеет верхний уровень
объект является словарем, и оттуда, в зависимости от
индикатор каждого значения может быть списком, словарем
или строка. Механизм схемы может
быть включено, что позволяет более конкретное декодирование
на классы и типы. Атрибут по умолчанию
реализуется через отдельную функцию.

Для Perl внутреннее представление начинается с
хэш верхнего уровня. И оттуда, в зависимости от
индикаторы могут быть списком, хешем или строковым скаляром.
Конечно, это также возможно для механизма схемы
быть включенным, что обеспечивает более конкретное декодирование.
Атрибут по умолчанию реализуется через автономный
функция.

Не занимался Java или Javascript с 1998 года, но я помню
Строки, карты и списки являются объектами. Так что не должно быть
любая проблема в Java. Javascript, вероятно, находится в
ту же лодку, но я не могу подтвердить, так как эта книга
также таинственно исчез.

Для ML, C и C++, в которых отсутствует встроенная переменная
структура типа Map и List требует определенной схемы
построить внутреннее представление. Для этих языков
тип YamlValue может быть создан с подтипами
Скаляр, список и карта. Для C++ STL может сделать
реализация очень быстрая, особенно с итератором
поддерживать. Альтернативным подходом может быть класс
строитель… но для этого, конечно, требуется немного
больше смартов и схема системы.

Сопоставление с реляционной базой данных также потребует
какая-то схема, указывающая, как упаковывать/распаковывать.
Однако, учитывая, что кортеж (запись) легко
связан с Картой, а отношение (таблица)
легко ассоциируется со списком, не должно быть
столько трудностей. Сопоставление значений NULL будет
быть представлен отсутствием конкретной карты
вход.


Формат сериализации / BNF

В этом разделе собраны произведения БНФ.
для синтаксиса YAML. Много сделать…


Поведение парсера

В этом разделе описывается, как синтаксический анализатор должен
разобрать YAML. Много сделать…


Поведение эмиттера/каноническая форма

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


Реализации

Сделать… реализацию на C, C++/STL, Python, Java и…


Кредиты

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


Некоторые мысли
  1. Это очень предварительные мысли по этому поводу,
    обратная связь очень приветствуется.
  2. Необходимы реализации… Кларк с удовольствием пишет
    Python, C и, возможно, даже реализация C++.
    Есть берущие?
  3. Долго думал над использованием # для комментария
    индикатор или, возможно, числовой индикатор.
    Преимущества? В любом случае БНФ должен уйти
    все эти специальные символы открыты для будущего
    версии.

Часто задаваемые вопросы
  1. Разве символы индикатора не должны быть
    сбежал в содержании? Ответ: нет.

Конкретные производства
Символ >  ::=  #x9 | #хА | #xД | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] Любой символ Юникода, за исключением суррогатных блоков,
ФФФЕ и ФФФФ. Где юникод определяется
ISO/IEC 10646-2000
Символы >  ::=  Чар* Ноль или более символов.
УайтЧар  ::=  #x20 | #x9 | #xД | #хА Пробел, табуляция, новая строка или возврат каретки,
экранируется символами \s, \t, \n и \r соответственно.
Пробел  ::=  БелыйЧар+ Любая последовательность пробелов, табуляции, новых строк
или возврат каретки.
Индикатор>  ::=  ‘$’ | ‘%’ | ‘@’ | ‘*’ Знак доллара указывает скаляр, знак процента
указывает на карту, знак at указывает на список,
а звездочка обозначает ссылку.
Зарезервировано>  ::=  Белый Чар | Индикатор | [#x21-#x2F] | ‘/’ | [#x3B-#x40] |
[#x5B-#x5E] | #x60 | [#x7B-#x7F]
Печатные, не буквенные, не числовые символы ASCII
исключая точку, двоеточие, подчеркивание и тире.
Ключ  ::=  (символ — зарезервировано)* Один или несколько незарезервированных символов.

YAML — еще один язык разметки

8

Пример

Добро пожаловать в ЯМЛ

YAML — это минимальный язык разметки, основанный на XML и Minimal XML. YAML это
на следующих принципах:

  • В первую очередь для иерархического представления текстовых данных.
  • Совместимость с XML 1.0 хороша, но не обязательна.
  • Целостность математики/модели важна
  • Многословность приемлема, регулярность предпочтительна
  • YAML должен дополнять другие обозначения и типы данных.
  • строгая типизация данных была бы идеальной
  • Прямая поддержка типов данных Standard ML была бы отличной.

Таким образом, YAML определяется как помеченная древовидная структура. Отличается
из XML разными способами:

  • Поддерживаются только элементы, без PI, комментариев, атрибутов и т. д.
  • Допускается сокращенный синтаксис элемента .
  • Элементы имеют значение или дочерние элементы, но никогда оба.
  • Пространства имен не поддерживаются, используется двоеточие.
  • UTF-16/ISO8859-1 — единственные кодировки (на данный момент)
  • Допускается более одного элемента верхнего уровня (для совместимости с XML
    не делайте этого, но это необходимо для конкатенации
    закрытый оператор)
  • Обработка пробелов аналогична HTML, один или несколько
    вхождения табуляции, ввода и т. д. сжимаются в
    единое пространство.

Тип данных

Имена тегов состоят из двух частей: метки и типа данных.
Эти части разделены двоеточием. Поддерживаемый
типы данных:

Integer: INT Точное целое число (оператор равенства)
Реальный: Реальный Неточный плавающий , могут использоваться целые числа или шестнадцатеричная запись.
Булево значение :bool Либо «истина», либо «ложь».
Строка (по умолчанию) Строковое значение & < и > допустимый.
Список :список Это упорядоченный список элементов одного типа.
Запись :запись Это неупорядоченная карта, каждая метка должна быть уникальной.
Кортеж
:кортеж Используйте _1, _2 и т. д. для имен тегов.

Для удобства испускаются следующие «производные» типы. Они
не являются стандартными типами ML, но, тем не менее, могут быть полезны.

Сумка (по умолчанию) Упорядоченный список предметов любого типа.
IntegerList :intlist Список целых чисел, разделенных пробелом.
RealList :reallist Список действительных чисел, разделенных пробелом.
CharList :charlist Список символов, разделенных пробелом.
Двоичный :base64 Строка, закодированная с помощью Base64, в группах по 8 символов, разделенных пробелами.

Примечание. Если требуется строгая совместимость XML+пространства имен,
документ может иметь только содержимое Bag/String. В противном случае,
вышеприведенное совместимо с XML 1.0, где эксперимент «пространство имен»
является строгим типом данных!


Имена тегов

Как правило, имена тегов соответствуют требованиям к именам тегов XML.
хотя теги с точками имеют особое значение, а теги
начинающиеся с подчеркивания, зарезервированы. Особенно,
теги с одной или несколькими точками должны использовать структуру на основе DNS
где самые правые части являются доменом верхнего уровня, например
«com», «org», «co.uk». Затем непосредственно перед вершиной
домен уровня, является зарегистрированной частью, как и «clarkevans».
А предыдущая зарегистрированная часть зависит от пользователя.
Поэтому: «timesheet.clarkevans.com» и «zoom.mytag.domain.co.uk»
оба будут действительными именами в соответствии с этой схемой.

Также обратите внимание, что тип данных может быть добавлен в конец
любого из этих типов данных с помощью :, как описано выше.
Таким образом, «timesheet.clarevans.com:list» будет глобальным
квалифицированный список.


Информационная модель

Информационная модель для YAML выглядит следующим образом.
(большое заимствование из Minimal XML).

9000

Тег := Последовательность одного или нескольких символов
Значение: = Последовательность из одного или нескольких символов
Узел: = TAG
+ Значение XOR
11101107 Значение XOR11107.

Упорядоченная последовательность одного или нескольких узлов

Кроме того, узел может иметь следующую вычисляемую информацию.

ExtVal Расширенное значение узла. Это
Значение, если узел имеет значение, иначе
он определяется как ExtVal
первый ребенок в последовательности Дети
Тип Один из перечисленных выше типов данных.
Метка Тег без трейлера :type
Сегменты[] Массив сегментов Метки между периодами
08

  
    <человек:запись>
      <идентификатор: целое>
        293945
      <имя:запись>
        <дано>
          Кларк
        <семья>
          Эванс
    <журнал:список>
      <журнал:запись>
        <дата:запись>
          <день:целое>
            12
          <месяц:целое>
            1
          <год:целое>
            2001
        <описание>
           В этот день я работал над тремя темами,
           скоро последует. 
        <запись: список>
          <запись: запись>
            <длительность:целое>
               120
            <проект>
              Самообучение, ML
            <описание>
              Пройдена глава 3 книги.
            <ссылка: список>
              <ссылка>
                Элементы программирования машинного обучения, Джеффри
                Д. Ульман, ML97 издание
                  
          <запись: запись>
            <длительность:целое>
              90
            <проект>
              Двойные Близнецы
            <описание>
              Работа над графиком разработки программного обеспечения, окончательная поставка
              дата конец марта.
                
                
 

Некоторые мысли
  1. Это очень предварительные мысли по теме, обратная связь
    очень приветствуется.

    This entry was posted in Популярное