Алик Кириллович

Два типа языков разметки: языки в стиле XML и языки в стиле YAML

07 июля 2008 г.

Существует два типа языков разметки: языки в стиле XML и языки в стиле YAML.

Языки в стиле XML

В XML-языках все элементы, вне зависимости от их смысла оформляются с помощью общих синтаксических конструкций.

Примеры XML-языков:

xHTML:

В xHTML синтаксис:

            
               Содержимое
              
            !!!]]>
          

имеют все элементы, вне зависимости от их семантики: заголовки, ссылки, списки, таблицы и т.д.

Языки в стиле YAML

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

Например, в Wiki-разметке для задания горизонтальной линии используют ----, т.к. эта конструкция внешне напоминает линию; для задания списка перед каждым пунктом ставят *, т.к. она внешне напоминает маркер списка.

Примеры YAML-языков:

Wiki-разметка:

В Wiki-разметке каждый тип элемента имеет свой синтаксис:

Для выделения текста жирным шрифтом, текст обрамляется тремя одинарными кавычками: '''жирный текст'''.

Названия разделов статьи обрамляются двумя (или тремя для подразделов) знаками равенства: === Заголовок ===.

Для горизонтальной линии используется четыре дефиса: ----.

Списки делаются так: на каждой отдельной строке ставится символ # и затем следует пункт списка. Для ненумерованных списков используется *, например:

            * Пункт 1;
            * Пункт 2;
            * Пункт 3.
          

Ссылки обрамляются конструкцией вида: [[Название целевой статьи|видимый текст ссылки]

Для картинок используется следующая конструкция: [[Image:имя_файла.png]]

Для таблиц такая:

            {|  
             |Ячейка 1-1  
             |Ячейка 2-1  
             |-  
             |Ячейка 1-2  
             |Ячейка 2-2  
             |}
           

И т.д.

YAML:
 
Textile:
 
Математическая нотация:

В математической нотации для каждого действия используется своя запись. Даже арифметические действия записываются по-разному:

Сложение, вычитание и умножение имеет следующий синтаксис: операнд1 оператор операнд2, например: 2+2, 5-3, 4*6.

Для записи деления, делимое размещают над делителем, и отделяется горизонтальной чертой, например: ¾. А для записи возведения в степень, вообще, обходятся без оператора, размещая показатель степени над основанием, например: 210

Каждый из этих типов языков имеет свои преимущества и недостатки:

Преимущества XML-языков:

Недостатки XML-языков:

Преимущества YAML-языков:

Недостатки YAML-языков:

Примеры использования

В нашей системе тестирования знаний «СИнТеЗ» для экспорта/импорта тестов используются языки обоих типов.

XML

Любой тест может быть экспортирован/импортирован в XML-формат.

Этот формат имеет все преимущества XML-языков: удобен для разбора стандартным XML-парсером, может содержать SVG или MathML-разметку, с помощью XSLT может быть преобразован в любой другой формат, например в международный стандарт дистанционного обучения SCORM.

Однако, ему присущи и недостатки XML-языков: большой размер и неудобность для человека.

Пример простейшего файла тестов:

Файл теста в формате XML:
            
              
                
                  
                    
                      
                        
                        
                        
                      
                    
                    
                      
                        
                        
                        
                        
                      
                    
                  
                
                
                  
                    
                      
                        
                      
                    
                    
                      
                        
                        
                        
                      
                    
                    
                      
                        
                        
                        
                      
                    
                  
                
              
            
            !!!]]>
          

YAML

Также тест может быть импортирован в YAML-формат. Этот формат настолько прост, что преподаватель может составлять тест даже в отсутствии редактора тестов, просто в «Блокноте».

Файл теста в формате YAML:
            ***Тема 1
            
            ? Текст вопроса типа "выбор одного правильного варианта"
            +Правильный вариант
            -Неправильный вариант
            -Неправильный вариант

            ? Текст вопроса типа "выбор нескольких правильных вариантов"
            +Правильный вариант
            +Правильный вариант
            -Неправильный вариант
            -Неправильный вариант

            
            ***Тема 2

            ? Текст вопроса типа "прямой ввод"
            =Правильный ответ

            ? Текст вопроса типа "соответствие"
            Левая часть 1 <-> Правая часть 1
            Левая часть 2 <-> Правая часть 2
            Левая часть 3 <-> Правая часть 3

            ? Текст вопроса типа "упорядочивание"
            1. Первый пункт упорядочивания
            2. Второй пункт упорядочивания
            3. Третий пункт упорядочивания
          

Вывод:

XML-языки понятны человеку, но больше предназначены для компьютера. YAML-языки понятны компьютеру, но больше предназначены для человека.

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

Примечания

Библиотека подсветки синтаксиса в этой статье основана на «highlight.js» от Ивана Сагалаева.

17 комментариев:

  1. Евгений
    01.12.2008, 02:42

    <мое сугубо личное мнение>XML(сильно упрощённая версия SGML) намного эффективнее справляется со своей основной задачей <обратите внимание>внесением метаинформации в текст</обратите внимание>.

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

    Что легче для преподавателя: потратить время на а) изучение синтаксиса вашего мини-языка или b) потратить время на обучение азам работы в "дружественном", "интуитивно-понятном" GUI-редакторе тестов?

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

    Конечно, если такие задачи решать не надо - то можно обойтись и YAML-разметкой. Но смысл? Зачем себя так ограничивать?</мое сугубо личное мнение>

  2. Алик Кириллович
    02.12.2008, 23:42

    @Евгений

     

    Насчет понятности человеку первой и второй версии разметок - я с вами мог бы поспорить.

    Что легче для преподавателя: потратить время на а) изучение синтаксиса вашего мини-языка или b) потратить время на обучение азам работы в "дружественном", "интуитивно-понятном" GUI-редакторе тестов?

    Конечно, работать с GUI проще, чем непосредственно с языком разметки.

    Но, когда GUI недоступен, и приходится выбирать между двумя стилями разметки: XML или YAML , то, мне кажется, все таки, удобнее — YAML.

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

    Согласитесь, что для создания списка, YAML (Wiki) синтаксис:

    * Пункт 1;
    * Пункт 2;
    * Пункт 3.
    

    ...проще, чем XML (HTML) синтаксис:

    <ul>
      <li>Пункт 1;</li>
      <li>Пункт 2;</li>
      <li>Пункт 3;</li>
    </ul>
    
    

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

     

    Написать качественный YAML-парсер, ничуть не легче чем XML-парсер

    Да, конечно, об этом я и пишу в статье.

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

  3. Snowcore
    17.12.2008, 19:04

    Я всегда использовал XML, до знакомства с symfony framework - после этого я ощутил преимущества YAML :)

  4. aktuba
    15.01.2009, 01:11

    А я так и не смог найти преимуществ в YAML, кроме внешнего вида. Преимущества XML - легкая расширяемость, неограниченные метаданные, популярность. Кстати, воспринимается XML очень легко, если хоть изредка с ним работать ;)

    А где преимущества YAML?

  5. Алик Кириллович
    09.02.2009, 06:15

    @aktuba

    А где преимущества YAML?

    О преимуществах и недостатках XML и YAML я и написал в статье.

    Главное преимущество YAML-языков — удобство восприятия и редактирования человеком.

    Согласитесь, что Wiki-разметка:

    * Пункт 1;
    * Пункт 2;
    * Пункт 3.
    

    воспринимается легче, чем HTML:

    <ul>
      <li>Пункт 1;</li>
      <li>Пункт 2;</li>
      <li>Пункт 3;</li>
    </ul>
    
    

    А математическая запись:

    a*x^2 + b*x + c
    

    воспринимается и редактируется проще, чем MathML:

    <apply>
      <plus/>
      <apply>
        <times/>
        <ci>a</ci>
        <apply>
          <power>
            <ci>x</ci>
            <cn>2</cn>
          </power>
        </apply>
      </apply>
      <apply>
        <times/>
        <ci>b</ci>
        <ci>x</ci>
      </apply>
      <ci>c</ci>
    </apply>
    
    

    Однако, разумеется, YAML-языки имеют и недостатки, которые я также перечислил в статье.

  6. Тормоз
    09.06.2009, 16:53

    Из YAML постоянно пользуюсь "Текстилем", т. к. он встроен в CMS TextPattern, в том числе и в форме комментариев (хотя подсказок не даю, чтобы спамеры не досаждали). Очень удобная штука! Кстати, Алик, вот у вас чтобы выделить слово жирным надо набрать дополнительно аж 7 символов, а в Textile для этого используется всего две звёздочки ;)

  7. Тормоз
    09.06.2009, 16:54

    О, клёвый у меня тут мутант получился.

  8. Денис Радченко
    10.06.2009, 14:44

    Для внутреннего использования разрабатываю систему тестирования. Не против, если я использую ваш формат YAML для вопросов?

  9. Алик Кириллович
    10.06.2009, 15:02

    @Денис Радченко

    Для внутреннего использования разрабатываю систему тестирования. Не против, если я использую ваш формат YAML для вопросов?

    Нет не против — используйте на здоровье :-)

  10. Игорь
    26.10.2009, 12:12

    Пользуюсь хмл так как он более распостранен универсален и удобен.

  11. tenshi
    12.03.2010, 04:47

    ещё можно развить идею hiqus и сделать язык двумерной разметки типа такого:

    Тема 1:
    
    :Текст вопроса типа ""выбор одного правильного варианта"":
    
    ::Правильный вариант:right:true
    ::Неправильный вариант1:right:false
    ::Неправильный вариант2:right:false
    
    :Текст вопроса типа ""выбор одного правильного варианта"":
    
    ::Правильный вариант1:right:true
    ::Правильный вариант2:right:true
    ::Неправильный вариант1:right:false
    ::Неправильный вариант2:right:false
    
    Тема 2:
    
    :Текст вопроса типа ""прямой ввод"":Правильный ответ
    
    :Текст вопроса типа ""соответствие"":
    ::Левая часть 1:to:Правая часть 1
    ::Левая часть 2:to:Правая часть 2
    ::Левая часть 3:to:Правая часть 3
    
    :Текст вопроса типа ""упорядочивание"":
    ::Первый пункт упорядочивания:
    ::Второй пункт упорядочивания:
    ::Третий пункт упорядочивания:
    

    по мощности он эквивалентен хмл, но визуально воспринимается по проще

    примерный эквивалент в json:

    { 'Тема 1':
    
     { 'Текст вопроса типа ""выбор одного правильного варианта""':
      { 'Правильный вариант': { right: true }
      , 'Неправильный вариант1': { right: false }
      , 'Неправильный вариант2': { right: false }
      }
    
     , 'Текст вопроса типа ""выбор одного правильного варианта""':
      { 'Правильный вариант1': { right: true }
      , 'Правильный вариант2': { right: true }
      , 'Неправильный вариант1': { right: false }
      , 'Неправильный вариант2': { right: false }
      }
     }
    
    , 'Тема 2':
    
     { 'Текст вопроса типа ""прямой ввод""': Правильный ответ }
    
     , 'Текст вопроса типа ""соответствие""':
      { 'Левая часть 1': { to: 'Правая часть 1' }
      , 'Левая часть 2': { to: 'Правая часть 2' }
      , 'Левая часть 3': { to: 'Правая часть 3' }
      }
    
     , 'Текст вопроса типа ""упорядочивание""':
      { 'Первый пункт упорядочивания': null
      , 'Второй пункт упорядочивания': null
      , 'Третий пункт упорядочивания': null
     }
    
    }
    

    ну и хмл аналогичный..

  12. Riim
    06.04.2010, 09:48

    Еще один момент, о котором забыли - разное количество спецсимволов способных "сломать" документ. Печатая текст в XML-файле мне нужно следить только за тремя символами ( &, <, > ), при добавлении текста в YAML придется быть куда более внимательным. Если ситуация потребует совсем уж сложной YAML-разметки, то работа с таким документом может и вовсе потребовать заметно большего внимания чем работа с XML. Частично проблему можно решить "объяснив" парсеру, что некоторые символы нужно понимать как спецсимволы, только если они находятся в самом начале строки.

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

  13. Кредит
    24.05.2010, 04:30

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

  14. amago
    16.07.2010, 11:28

    Почувствовал себя в танке. Работал с XML, но не разу не слышал о YAML. Но для меня уже XML гораздо понятнее выглядит, итак понятно)))

  15. Макс
    05.08.2010, 08:22

    да, я тоже работал с XML, так что только это и понимаю, а про YAML - очень полезно было узнать

  16. Ирина
    12.08.2010, 17:45

    Вот ведь - про YAML впервые слышу...век живи век учись)

    Но "занимает мало места" очень мотивирует.

  17. Andrew
    15.08.2010, 16:14

    У меня друг программист, недавно что-то такое мне рассказывал, но мне было не интересно.

    А тут все очень интересно расписано

Добавить комментарий

Имя:
E-mail (не публикется):
Веб-сайт (ссылки не «глушатся» nofollow):
Текст:
Вы можете использовать BBCode:
[b]жирность[/b]
[i]курсив[/i]
[u]подчеркивание[/u]
[s]перечеркивание[/s]
[url]http://www.example.com[/url]
[url=http://www.example.com]Текст ссылки[/url]
[quote]Цитата[/quote]
[code]
код на
  языке
программирования
[/code]
[list]
* Список
* Список
* Список
[/list]

Статьи

About

Подписка

Ждите...

Valid XHTML 1.0 Strict © Алик Кириллович, 2008—2010