|
Персональные инструменты |
![]() |
||
|
![]() |
![]() YAMLМатериал из CustisWikiТим Брэй, один из авторов спецификации XML 1.0, недавно столкнулся с проблемой извлечения небольших данных из большого XML-файла. На своем веблоге Тим Брэй признался , что он не очень доволен результатами, сообщает газета "Компьютерные вести". Похоже, уже даже до создателей XML начинает доходить, что если программисты http://www.xmlsuck.com/ и создают http://www.yaml.org/ ему, то, наверное, у этого формата и правда есть недостатки, не позволяющие ему быть действительно универсальным. Clark Evans: Тогда давайте будем независимыми. В следующей версии давайте _полностью_ откажемся от синтаксиса XML. Я серьёзно. Меня достали теги и их производные.
YAML создан Clark Evans'ом, для реализации следующих требований:
Легок для чтения и записиСинтаксис YAML сверхлегкий, особенно по сравнению с XML ным синтакисом, и хотя в спецификации не говорится о WikiWiki разметке - YAML очень похож на WikiWiki разметку. Вообще, в спецификации указывают, что большое влияние оказал стандарт RFC 822. Рассмотрим примеры. Итак, в некотором питоновском проекте нужно хранить конфигурацию, описывающую отображение текстовых команд на функции, с помощью регулярных выражений. Структура данных на Питоне будет выглядеть так: [ ("PRIVMSG", "newUri", "^http://.*"), ("PRIVMSG", "deleteUri", "^delete.*"), ("PRIVMSG", "randomUri", "^random.*") ] Тут можно насчитать подрядка 30 "вспомогательных" символов, необходимых для описания структуры - неплохо. Можно представить эту структуру плоским текстом, типа конфигурационного файла от древней UNIX-программы: PRIVMSG newUri ^http://.* PRIVMSG deleteUri ^delete.* PRIVMSG randomUri ^random.* Тогда "overhead" вообще минимален, но все становится очень негибко - значения не могут включать пробелы, не могут быть многострочными и т.п. Но в простых приложениях это сойдет. В XML, "overhead" сильно больше: <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> Конечно, можно сделать более "дешевое" отображение с использованием атрибутов (и потерей гибкости): <bindings> <binding ircEvent="PRIVMSG" method="newUri" regex="^http://.*" /> ... </bindings> Но по любому понятно, что все это очень неоптимально и неудобно для ручного редактирования, а "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 СсылкиВнимание! Эта статья была создана путем автоматического реплицирования из внутренней базы знаний компании Заказные Информ Системы. Любые правки этой статьи могут быть перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion». |
![]() |
![]() |
![]() |