YAML
Тим Брэй, один из авторов спецификации XML 1.0, недавно столкнулся с проблемой извлечения небольших данных из большого XML-файла. На своем веблоге Тим Брэй признался , что он не очень доволен результатами, сообщает газета "Компьютерные вести".
Похоже, уже даже до создателей XML начинает доходить, что если программисты http://www.xmlsuck.com/ и создают http://www.yaml.org/ ему, то, наверное, у этого формата и правда есть недостатки, не позволяющие ему быть действительно универсальным.
Clark Evans: Тогда давайте будем независимыми. В следующей версии давайте _полностью_ откажемся от синтаксиса XML. Я серьёзно. Меня достали теги и их производные.
YAML = Yaml Is Not Markup Language, создан как некоторая альтернатива XML. Проблема XML - неудобство для редактирования и чтения текста человеком.
YAML - решает ту же задачу, что и XML, т.е. представление произольной сложности структур данных, но в форме, удобной для человека, такие же аналоги можно провести между HTML и WikiWiki разметкой.
YAML создан Clark Evans'ом, для реализации следующих требований:
- YAML краток и понятен.
- YAML очень выразительный и расширяемый.
- YAML допускает простой потоковый интерфейс.
- YAML использует структуры данных, родные для языков програмирования.
- YAML легко реализуется, возможно, слишком легко.
- YAML использует цельную модель данных. Нет исключений -- нет беспорядка.
Легок для чтения и записиПравить
Синтаксис YAML сверхлегкий, особенно по сравнению с XML ным синтакисом, и хотя в спецификации не говорится о WikiWiki разметке - YAML очень похож на WikiWiki разметку. Вообще, в спецификации указывают, что большое влияние оказал стандарт RFC 822.
Рассмотрим примеры. Итак, в некотором питоновском проекте нужно хранить конфигурацию, описывающую отображение текстовых команд на функции, с помощью регулярных выражений. Структура данных на Питоне будет выглядеть так:
<code-python>
[ ("PRIVMSG", "newUri", "^http://.*"), ("PRIVMSG", "deleteUri", "^delete.*"), ("PRIVMSG", "randomUri", "^random.*") ]
</code-python>
Тут можно насчитать порядка 30 "вспомогательных" символов, необходимых для описания структуры - неплохо.
Можно представить эту структуру плоским текстом, типа конфигурационного файла от древней UNIX-программы:
PRIVMSG newUri ^http://.* PRIVMSG deleteUri ^delete.* PRIVMSG randomUri ^random.*
Тогда "overhead" вообще минимален, но все становится очень негибко - значения не могут включать пробелы, не могут быть многострочными и т.п. Но в простых приложениях это сойдет.
В XML, "overhead" сильно больше: <code-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>
</code-xml>
Конечно, можно сделать более "дешевое" отображение с использованием атрибутов (и потерей гибкости):
<code-xml>
<bindings> <binding ircEvent="PRIVMSG" method="newUri" regex="^http://.*" /> ... </bindings>
</code-xml>
Но по любому понятно, что все это очень неоптимально и неудобно для ручного редактирования, а "space overhead" вреден не только расходом ресурсов для хранения, но и неудобством чтения - трудно выделить смысловую информацию в мешанине тэгов.
Теперь то же самое на YAML:
--- - - PRIVMSG - newUri - '^http://.*' - - PRIVMSG - deleteUri - ^delete.* - - PRIVMSG - randomUri - ^random.*
"Space overhead" - 12 четко видимых символов, и некоторое количество пробелов и переводов строк. (YAML использует "---", для разделения документов внутри файла или потока.)
Говоря об отличиях YAML от XML, отметим также, что вложеннее XML элементы обычно используются для отображения иерархических структур, а YAML более ближе к отображению моделей данных из Perl, Python, Java, позволяя описывать свободные винигреты из последовательностей, отображений и скалярных типов - т.е. ближе к реальным структурам данных программных языков, и не требует различных соглашений про DOM-отображения структур данных на документы и обратно, как требуется в XML.
ПримерыПравить
СчетПравить
--- !clarkevans.com/^invoice invoice: 34843 date : 2001-01-23 bill-to: &id001 given : Chris family : Dumars address: lines: | 458 Walkman Dr. Suite #292 city : Royal Oak state : MI postal : 48046 ship-to: *id001 product: - sku : BL394D quantity : 4 description : Basketball price : 450.00 - sku : BL4438H quantity : 1 description : Super Hoop price : 2392.00 tax : 251.42 total: 4443.52 comments: > Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
Лог файлПравить
---Time: 2001-11-23 15:01:42 -5 User: ed Warning: This is an error message for the log file --- Time: 2001-11-23 15:02:31 -5 User: ed Warning: A slightly different error message. --- Date: 2001-11-23 15:03:17 -5 User: ed Fatal: Unknown variable "bar" Stack: - file: TopClass.py line: 23 code: | x = MoreObject("345\n") - file: MoreClass.py line: 58 code: |- foo = bar