XML

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
XML (англ. eXtensible Markup Language) расширяемый язык разметки

XML.svg

Расширение

.xml

MIME

application/xml[1], text/xml[2] (deprecated in an expired draft)[3]

Разработчик

Консорциум Всемирной паутины

Опубликован

1998

Тип формата

язык разметки

Расширен из

SGML

Развит в

XHTML, RSS, Atom, KML, SVG и множество других форматов

Стандарт(ы)

1.0 (Fifth Edition), 26 ноября 2008 года[4]
1.1 (Second Edition), 16 августа 2006 года[5]

Открытый формат?

да

XML (англ. eXtensible Markup Language — расширяемый язык разметки; произносится [экс-эм-эл]) — рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки. Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров (программ, читающих XML-документы и обеспечивающих доступ к их содержимому). XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете. Язык называется расширяемым, поскольку он не фиксирует разметку, используемую в документах: разработчик волен создать разметку в соответствии с потребностями к конкретной области, будучи ограниченным лишь синтаксическими правилами языка. Сочетание простого формального синтаксиса, удобства для человека, расширяемости, а также базирование на кодировках Юникод для представления содержания документов привело к широкому использованию как собственно XML, так и множества производных специализированных языков на базе XML в самых разнообразных программных средствах.

XML является подмножеством SGML.

Содержание

Язык XML[править | править исходный текст]

Спецификация XML описывает язык и ряд вопросов, касающихся кодировки и обработки документов. Материал этой секции представляет собой сокращённое изложение описания языка в Спецификации XML, адаптированное для настоящей статьи.

Нормативным считается английский вариант документа, поэтому основные термины приводятся с их английскими оригиналами.

Перевод основных терминов в основном следует доступному в интернете переводу Спецификации на русский язык, исключение составляют термины tag и declaration.

Для термина tag здесь используется перевод тег как соответствующий текущим нормам русского языка.

Для термина declaration отдано предпочтение распространённому переводу объявление (против также распространённой кальки декларация).

В литературе и интернете могут встречаться и иные переводы основных терминов.

Физическая и логическая структуры документа[править | править исходный текст]

С физической точки зрения документ состоит из сущностей(англ. entities), из которых каждая может отсылать на другую сущность. Единственный корневой элемент — документная сущность. Содержание сущностей — символы.

С логической точки зрения документ состоит из комментариев(англ. comments), объявлений(англ. declarations), элементов(англ. elements), ссылок на сущностей(англ. character references) да инструкций обработки(англ. processing instructions). Всё это в документе структуризуется разметкою(англ. markup).

Физическая структура[править | править исходный текст]

Сущность — мельчайшая часть в документе. Все сущности чего-нибудь да содержат, и у всех у них есть имя(существуют исключения, напр. документная сущность). Проще говоря, термин «сущность» описывает «сущую вещь», «что-то»[6].

Документ состоит из сущностей, которых содержание — символы. Все они разделены на два типу: символьных данных (англ. character data) и разметки. К разметке принадлежат: теги(англ. tags), обозначающие границы элементов, объявления и инструкции обработки, включая их атрибуты(англ. attributes), ссылки на сущностей, комментарии, а также последовательности символов, обрамляющие секции «CDATA». Часть документа, не принадлежащая разметке, составляет символьные данные документа.

Логическая структура[править | править исходный текст]

Все составляющие части документа обообщаются в пролог и корневой элемент. Корневой элемент — обязательная часть документа, составляющая всю его суть(пролог, вообще говоря, может отсутствовать). Может включать (а может не включать) вложенные в него элементы и символьные данные, а также комментарии. Вложенные в корневой элемент элементы, свою очередь, могут включать вложенные в них элементы, символьные данные и комментарии, и так далее. Пролог может включать объявления, инструкции обработки, комментарии. Его следует начинать с объявления XML, хотя в определённой ситуации допускается отсутствие этого объявления.

Элементы документа должны быть правильно вложены: любой элемент, начинающийся внутри другого элемента (то есть любой элемент документа, кроме корневого), должен заканчиваться внутри элемента, в котором он начался. Символьные данные могут встречаться внутри элементов как непосредственно так и в специальных секциях «CDATA». Объявления, инструкции обработки и элементы могут иметь связанные с ними атрибуты. Атрибуты используются для связывания с логической единицей текста пар имя-значение.

Символы разметки[править | править исходный текст]

Разметка всегда начинается символом < и заканчивается символом >. Наряду с символами < и >, специальную роль для разметки играет также символ &. Угольные скобки обозначают границы элементов, инструкций обработки и некоторых других последовательностей. Амперсанд позволяет выполнить замену тексту при помощи сущностей(англ. entities)[7][8].

Решение проблемы неоднозначности разметки[править | править исходный текст]

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

Символ Замена
< &lt;
> &gt;
& &amp;

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

' &apos;
" &quot;

Правило замены символов, используемых в разметке, на ими обозначаемых сущностей не распространяется на символьные данные в секциях «CDATA», зато выполняется во всех остальных местах документа.

Имена[править | править исходный текст]

Пролог[править | править исходный текст]

Объявление XML[править | править исходный текст]

Объявление XML объявляет версию языка, на которой написан документ. Поскольку интерпретация содержимого документа, вообще говоря, зависит от версии языка, то Спецификация предписывает начинать документ с объявления XML. В первой (1.0) версии языка использование объявления не было обязательным, в последующих версиях оно обязательно. Таким образом, версия языка определяется из объявления, и если объявление отсутствует, то принимается версия 1.0.

Кроме версии XML, объявление может также содержать информацию о кодировке документа и «оставаться ли документу со своим собственным DTD, или с подключённым».

Пример:

<?xml version="1.1" encoding="UTF-8" ?>

или:

<?xml version="1.0" encoding="windows-1251"?>

Во всех этих примерах отсутствовал аттрибут «standalone», который как раз и определяет, подключить ли документу описания разметки изо вне. По умолчанию он равен «no»:

<?xml version="1.0" encoding="windows-1251" standalone="yes"?>

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

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

Так мы явно задаём, что DTD подключается изо вне.

Объявление типа документа[править | править исходный текст]

Для объявления типа документа существует специальная инструкция !DOCTYPE. Она позволяет задать при помощи языка DTD, какие в документ входят элементы, каковы их аттрибуты, какие сущности могут использоваться и кое-что ещё.

Например, вот корректный документ:

<?xml version="1.0"?>
<greeting>Hello, world!</greeting>

В нём есть корневой элемент <greeting>Hello, world!</greeting>, и с логической точки зрения документ существует. Однако он недействителен(англ.  not valid)[9].

При помощи Объявления типа документа(оно же DTD)возможно описывать его содержания и логическую структуру, а также связывать со определённым элементом пару «имя — значение».

Запишем, как выглядит пролог, используя запись Бэкуса — Наура[10]:

prolog        ::=     XMLDecl? Misc* (doctypedecl Misc*)?
XMLDecl    ::=     '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
VersionInfo        ::=     S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')
Eq         ::=     S? '=' S?
VersionNum         ::=     '1.' [0-9]+
Misc       ::=     Comment | PI | S
doctypedecl        ::=     '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
DeclSep    ::=     PEReference | S
intSubset          ::=     (markupdecl | DeclSep)*
markupdecl         ::=     elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment
extSubset          ::=     TextDecl? extSubsetDecl
extSubsetDecl      ::=     ( markupdecl | conditionalSect | DeclSep)*

Мы видим, что после XML-объявления могут следовать комментарии, инструкции обработки или же пустые пространства[11], но затем идёт Объявления типа документа, где «Name» — имя корневого тегу, «ExternalID» — внешний идентификатор, а «intSubset» — объявление разметки или же ссылка на сущность. Как гласит спецификация, если внешний идентификатор объявляется вместе со внутренним объявлением, последнее идёт перед первым[12].

Например:

<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>Hello, world!</greeting>

Здесь «SYSTEM "hello.dtd"» — внешний идентификатор: адрес «hello.dtd» позволяет задействовать данные в документе «hello.dtd» как объявления разметки.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
  <!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello, world!</greeting>

Здесь же разметка была объявлена местно.

Инструкция обработки[править | править исходный текст]

Инструкции обработки (англ. processing instruction, PI), позволяют размещать в документе инструкции для приложений. В следующем примере показана инструкция обработки, передающая xml-stylesheet-приложению (например, браузеру) инструкции в файле my-style.css посредством атрибута href:

<?xml-stylesheet href="my-style.css"?>

Комментарий[править | править исходный текст]

Комментарии (англ. comment) не относятся к символьным данным документа. Комментарий начинается последовательностью «<!--» и заканчивается последовательностью «-->», внутри не может встречаться комбинация символов «--». Символ & не используется внутри комментария в качестве разметки.

Пример:

<!-- это комментарий -->

Корневой элемент[править | править исходный текст]

Элемент и его разметка[править | править исходный текст]

Элемент (англ. element) является понятием логической структуры документа. Каждый документ содержит один или несколько элементов. Границы элементов представлены начальным и конечным тегами. Имя элемента в начальном и конечном тегах элемента должно совпадать. Элемент может быть также представлен тегом пустого, то есть не включающего в себя другие элементы и символьные данные, элемента.

Тег (англ. tag) — конструкция разметки, которая содержит имя элемента.

Начальный тег: <element1>

Конечный тег: </element1>

Тег пустого элемента: <empty_element1 />

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

Пример кулинарного рецепта, размеченного с помощью XML:

<recipe name="хлеб" preptime="5" cooktime="180">
  <title>Простой хлеб</title>
  <composition>
    <ingredient amount="3" unit="стакан">Мука</ingredient>
    <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
    <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
    <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
  </composition>
  <instructions>
    <step>Смешать все ингредиенты и тщательно замесить.</step>
    <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
    <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->
    <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
  </instructions>
</recipe>

Секция CDATA[править | править исходный текст]

Секция CDATA не является логической единицей текста. Секция может встречаться в любом месте документа, где синтаксис позволяет размещать символьные данные. Секция начинается <![CDATA[ и завершается ]]>. Между этой разметкой находятся символьные данные, символьные данные при этом включают символы < > & в их непосредственной форме.

Корректный документ[править | править исходный текст]

Корректный (англ. well-formed) документ соответствует всем общим правилам синтаксиса XML, применимым к любому XML-документу: правильная структура документа, совпадение имен в начальном и конечном теге элемента и т. п. Документ, который неправильно построен, не может считаться документом XML.

Пространства имён[править | править исходный текст]

Пример документа[править | править исходный текст]

<?xml version="1.0" encoding="UTF-8"?>


-<edsscript>


-<sequence name="start">

<action cmd="triggeron">btn*</action>

<action cmd="triggeron">msg_generic</action>

<action cmd="disablenbb">all</action>

<action cmd="setscrtext">@@Sisteme Giriş@@</action>

<action cmd="enablenbb">forward,mainmenu</action>

<action cmd="switchmsgtarget">LOGIN_DLG</action>

<action cmd="sendmsg">start</action>

<action cmd="jump">step2</action>

</sequence>


-<sequence name="step2">

<action cmd="waittrigger">btnforward</action>

<action cmd="triggeron">login*</action>

<action cmd="disablenbb">all</action>



<action cmd="sendmsg">check</action>

</sequence>


-<trigger name="login_succeded">

<condition type="appmsg">login_succeeded</condition>


-<sequence>

<action cmd="endscript"/>

</sequence>

</trigger>


-<trigger name="login_unknownuser">

<condition type="appmsg">login_unknownuser</condition>


-<sequence name="login_unknownuser">

<action cmd="disablenbb">all</action>

<action cmd="setscrtext">@@Hata@@</action>

<action cmd="showhtml">generic_neg.htm,@@Yanlış kullanıcı ismi@@,@@Lütfen kullanıcı ismini doğru giriniz.@@</action>

<action cmd="enablenbb">back</action>

<action cmd="waittrigger">btnback</action>

<action cmd="jump">start</action>

</sequence>

</trigger>


-<trigger name="login_incorrectpwd">

<condition type="appmsg">login_incorrectpwd</condition>


-<sequence name="login_incorrectpwd">

<action cmd="disablenbb">all</action>

<action cmd="setscrtext">@@Hata@@</action>

<action cmd="showhtml">generic_neg.htm,@@Hatalı parola@@,@@Lütfen parolanızı doğru giriniz.@@</action>

<action cmd="enablenbb">back</action>

<action cmd="waittrigger">btnback</action>

<action cmd="jump">start</action>

</sequence>

</trigger>



-<trigger name="btnback">

<condition type="buttonclick">back</condition>


-<sequence name="btnback">

<action cmd="triggeron">btnback</action>

</sequence>

</trigger>


-<trigger name="btnforward">

<condition type="buttonclick">forward</condition>


-<sequence name="btnforward">

<action cmd="triggeron">btnforward</action>

</sequence>

</trigger>


-<trigger name="btnmainmenu">

<condition type="buttonclick">mainmenu</condition>


-<sequence>


-<action cmd="jumpscript">

<value label="mainmenuscript" scope="local"/>

</action>

</sequence>

</trigger>


-<trigger name="btnquitapp">

<condition type="buttonclick">quitapplication</condition>


-<sequence name="btnquitapp">

<action cmd="callscript">quitapp.xml</action>

<action cmd="jump">start</action>

</sequence>

</trigger>


-<trigger name="error_generic">

<condition type="appmsg">error*</condition>


-<sequence>

<action cmd="showhtml">errdsc_null.htm,@@Hata@@</action>

<action cmd="disablenbb">all</action>

<action cmd="enablenbb">forward</action>

<action cmd="waittrigger">btnforward</action>

<action cmd="endscript"/>

</sequence>

</trigger>


-<trigger name="msg_generic">

<condition type="appmsg">msg_generic</condition>


-<sequence>

<action cmd="showhtml">generic_msg.htm</action>

<action cmd="triggeron">msg_generic</action>

</sequence>

</trigger>



-<trigger name="error_hardcodeside">

<condition type="appmsg">error_hardcodeside</condition>


-<sequence>

<action cmd="triggeroff">*</action>

<action cmd="triggeron">btnmainmenu</action>

<action cmd="triggeron">btnquitapp</action>

<action cmd="disablenbb">all</action>

<action cmd="enablenbb">mainmenu</action>

<action cmd="showhtml">errdsc_null.htm,Hata, @@İşlem sırasında bir hata meydana geldi.@@</action>

<action cmd="waittrigger">btnmainmenu</action>

</sequence>

</trigger>

</edsscript>

Регламентация работы с документами: правила, языки, программные интерфейсы[править | править исходный текст]

Этот раздел содержит изложение некоторых положений рекомендаций W3C, касающихся работы с документами. Соответствующие рекомендации могут относится как к документам XML, так и к более широкому классу документов. Ссылки, как правило, даются на средства работы с документами, рекомендованные W3C.

Кодировка документов[править | править исходный текст]

Спецификация требует, чтобы обрабатывающие программы поддерживали по крайней мере две кодировки Юникод: UTF-8 и UTF-16.

XML-процессор и приложение[править | править исходный текст]

Спецификация XML определяет понятия XML-процессор и приложение. XML-процессор (парсер) — программа, анализирующая разметку и передающая информацию о структуре документа другой программе — приложению.

Спецификация XML налагает определённые требования на процессор, не касаясь требований к приложению.

Действительный документ. Проверяющие и непроверяющие процессоры[править | править исходный текст]

Документ является действительным, если с ним связано объявление типа документа и если этот документ отвечает представленным в объявлении типа ограничениям.

XML процессоры делятся на два класса: проверяющие и непроверяющие.

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

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

Описание типов: языки схем[править | править исходный текст]

Для описания типов документов используются языки схем (англ. schema language). Поскольку XML является подмножеством языка SGML, то он унаследовал разработанный для SGML язык Document Type Definition (DTD). Позднее были разработаны и другие языки схем, наиболее известны из которых XML Schema, RELAX NG.

Преобразование документа XML[править | править исходный текст]

Для решения задачи преобразования документа XML в другую схему или другой формат предназначен язык XSLT.

Формат для визуализации документа[править | править исходный текст]

Для форматированного документа (документа, подготовленного к визуализации) предназначен формат XSL-FO.

Языки запросов[править | править исходный текст]

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

XQuery — язык программирования, ориентированный на работу с документами.

Интерфейс DOM[править | править исходный текст]

Document Object Model (DOM) — «объектная модель документа» — программный интерфейс для доступа к содержимому документов. Парсеры XML преобразуют документ XML в объект DOM.

Инструменты работы с документами: парсеры, средства создания и визуализации, системы баз данных[править | править исходный текст]

Реализации парсеров[править | править исходный текст]

XML имеет реализации парсеров для всех современных языков программирования[13].

Веб-браузеры как инструмент визуализации документа[править | править исходный текст]

  • Визуализация без использования стилей CSS

Без использования CSS или XSL XML-документ отображается как простой текст в большинстве веб-браузеров. Некоторые браузеры, такие как Internet Explorer, Mozilla Firefox и Opera (встроенный инструмент Opera Dragonfly) отображают структуру документа в виде дерева, позволяя сворачивать и разворачивать узлы с помощью нажатий клавиши мыши.

  • Применение стилей CSS

Процесс аналогичен применению CSS к HTML-документу для отображения. Для применения CSS при отображении в браузере, XML-документ должен содержать специальную ссылку на таблицу стилей. Например:

<?xml-stylesheet type="text/css" href="myStyleSheet.css"?>

Это отличается от подхода HTML, где используется элемент <link>.

  • Применение преобразований к XS-FO формату

Современные браузеры принадлежат к числу программных средств, способных выполнять преобразования XSLT. В браузере такое преобразование выполняется, как правило, для форматирования документа (преобразования документа в формат XSL-FO). Следующая инструкция в прологе документа XML предписывает браузеру выполнить XSLT-преобразование, описанное в файле transform.xsl:

<?xml-stylesheet type="text/xsl" href="transform.xsl"?>

Редакторы XML[править | править исходный текст]

С документом XML можно работать в обычном текстовом редакторе, однако обычные редакторы не поддерживают структуру документа. Существуют специальные редакторы XML, которые делают работу с документом более удобной и эффективной.

Системы управления базами данных, работающие с данными в формате XML[править | править исходный текст]

Система управления базами данных DB2 позволяет хранить данные в формате XML и предоставляет доступ к таким данным с помощью языка XQuery.

Поддержка на аппаратном уровне[править | править исходный текст]

XML поддерживается на низком аппаратном, микропрограммном и программном уровнях в современных аппаратных решениях[14].

Область применения, ограничения, перспективы развития[править | править исходный текст]

Эффективность использования XML[править | править исходный текст]

XML — язык разметки, другими словами, средство описания документа. Именно в нише документов, текстов, где доля разнотипных символьных данных велика, а доля разметки мала — XML успешен. С другой стороны, обмен данными в открытых системах не сводится к обмену документами. Избыточность разметки XML (а в целях разработки языка прямо указано, что лаконичность не является приоритетом проекта) сказывается в ситуациях, когда данные не вписываются в традиционную модель документа. Лента новостей, например, оформляемая с использованием синтаксиса XML (форматы RSS, Atom), представляет собой не документ в традиционном понимании, а поток однотипных мини-документов — многословная и избыточная разметка в этом случае составляет существенную часть передаваемых данных.

W3C озабочен эффективностью применения XML, и соответствующие рабочие группы занимаются этой проблемой (к началу 2013 года нормативные документы не разработаны).

Другая ситуация, когда форматы XML могут оказаться не лучшим решением - работа с данными с простой структурой и небольшим по объёму содержанием полей данных. В этом случае доля разметки в общем объёме велика, а программная обработка XML может оказаться неоправданно затратной, по сравнению с работой с данными более простой структуры. В этой области разработчики рассматривают средства, изначально ориентированные на данные, такие как INI, YAML, JSON.

Скриптовый язык для работы с XML[править | править исходный текст]

W3C работает над созданием скриптового языка для работы с XML (к началу 2013 года нормативные документы не разработаны).

См. также[править | править исходный текст]

  • XHTML — версия HTML, отвечающая синтаксическим требованиям XML.
  • SOAP — протокол передачи данных, использующий для сообщений формат XML.
  • FB2 — формат описания книг, базирующийся на XML

Примечания[править | править исходный текст]

  1. XML Media Types, RFC 3023 9–11. IETF (январь 2001). Проверено 4 января 2010. Архивировано из первоисточника 22 августа 2011.
  2. XML Media Types, RFC 3023 7–9. IETF (январь 2001). Проверено 4 января 2010. Архивировано из первоисточника 22 августа 2011.
  3. M. Murata, D. Kohn, and C. Lilley. Internet Drafts: XML Media Types. IETF (24 сентября 2009). Проверено 10 июня 2010. Архивировано из первоисточника 22 августа 2011.
  4. Extensible Markup Language (XML) 1.0 (Fifth Edition)
  5. Extensible Markup Language (XML) 1.1 (Second Edition)
  6. Объяснение слова «entity» во спецификации языка XML.
  7. Под термином «сущность» следует понимать «сущую вещь», проще говоря, «что-то».
  8. Объяснение слова «entity» во спецификации языка XML.
  9. Объяснение слова «valid» во спецификации.
  10. Использование формы Бэкуса — Наура во спецификации.
  11. Запись пустого пространства в форме Бэкуса — Наура.
  12. If both the external and internal subsets are used, the internal subset MUST be considered to occur before the external subset.
  13. XML Parsers
  14. Intel XML Accelerator

Литература[править | править исходный текст]

  • Дэвид Хантер, Джефф Рафтер, Джо Фаусетт, Эрик ван дер Влист, и др. XML. Работа с XML, 4-е издание = Beginning XML, 4th Edition. — М.: «Диалектика», 2009. — 1344 с. — ISBN 978-5-8459-1533-7
  • Дэвид Хантер, Джефф Рафтер и др. XML. Базовый курс = Beginning XML. — М.: Вильямс, 2009. — 1344 с. — ISBN 978-5-8459-1533-7
  • Роберт Тейбор. Реализация XML Web-служб на платформе Microsoft .NET = Microsoft .NET XML Web Services. — М.: Вильямс, 2002. — 464 с. — ISBN 0-672-32088-6

Ссылки[править | править исходный текст]