Меню
Главная
Случайная статья
Настройки
|
XML (МФА: [eks.emel], аббр. от англ. eXtensible Markup Language) — «расширяемый язык разметки». Рекомендован Консорциумом Всемирной паутины (W3C). Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров (программ, читающих XML-документы и обеспечивающих доступ к их содержимому). XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов как программами, так и человеком, с акцентом на использование в Интернете.
Язык называется расширяемым, поскольку он не фиксирует разметку, используемую в документах: разработчик волен создать разметку в соответствии с потребностями к конкретной области, будучи ограниченным лишь синтаксическими правилами языка. Расширение XML — это конкретная грамматика, созданная на базе XML и представленная словарём тегов и их атрибутов, а также набором правил, определяющих, какие атрибуты и элементы могут входить в состав других элементов. Сочетание простого формального синтаксиса, удобства для человека, расширяемости, а также базирование на кодировках Юникод для представления содержания документов привело к широкому использованию как, собственно, XML, так и множества производных специализированных языков на базе XML в самых разнообразных программных средствах.
XML является подмножеством SGML.[источник не указан 24 дня]
На основе XML создаются специализированные форматы для хранения диаграмм, концептуальных карт и других моделей данных.
Содержание
Язык 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)[6].
Решение проблемы неоднозначности разметки
Употребление разметочных символов в символьных данных затрудняет распознавание конструкций разметки и может создать проблему неоднозначности структуры. В XML эта проблема решается следующим образом: <, > и & не могут присутствовать в символьных данных и в значениях атрибутов в их непосредственном виде, для их представления в этих случаях зарезервированы специальные сущности:
Символ |
Замена
|
< |
<
|
> |
>
|
&
|
&
|
Кроме того, для употребления апострофов и кавычек внутри значений атрибутов используются следующие сущности:
Правило замены разметочных символов на их обозначающие сущности не распространяется на символьные данные в секциях «CDATA», зато выполняется во всех остальных местах документа.
Числовые ссылки на символы
Числовые ссылки на символы указывают кодовую позицию символа в наборе символов документа. Числовые ссылки на символы могут принимать две формы[7]:
- синтаксис «&#D;», где D — десятичное число;
- синтаксис «&#xH;» или «&#XH;», где H — шестнадцатеричное число (шестнадцатеричные числа в числовых символьных ссылках не чувствительны к регистру).
Примеры числовых ссылок на символы:
- å — (в десятичной форме) представляет букву «а» с маленьким кружком над ней (используется, например, в норвежском языке);
- å — (в шестнадцатеричном) представляет собой тот же символ;
- å — (в шестнадцатеричном) также представляет тот же символ;
- И — (в десятичной форме) представляет заглавную букву кириллицы «I»;
- 水 — (в шестнадцатеричном) представляет китайский иероглиф «вода»;
Имена
В языке XML все имена должны начинаться с буквы, символа подчёркивания (_) и продолжаться только допустимыми для имён символами, а именно: они могут содержать только буквы, входящие в секцию букв кодировки Unicode, арабские цифры, дефисы, знаки подчёркивания, точки. Так как буквы не ограничены исключительно символами ASCII, то в именах можно использовать буквы из любого языка.
Пролог
Объявление XML указывает версию языка, на которой написан документ. Поскольку интерпретация содержимого документа зависит от версии языка, спецификация предписывает начинать документ с объявления XML. В первой (1.0) версии языка использование объявления не было обязательным, в последующих версиях оно обязательно. Если объявление отсутствует, версия языка считается равной 1.0.
Кроме версии XML, объявление может содержать информацию о кодировке документа и атрибут standalone .
Примеры:
<?xml version="1.1" encoding="UTF-8"?>
<?xml version="1.0" encoding="windows-1251"?>
Атрибут standalone указывает, требуется ли для корректной обработки документа использование внешних деклараций.
standalone="yes" — документ должен интерпретироваться корректно без обращения к внешней DTD.
standalone="no" — документ может использовать внешние декларации.
Если атрибут отсутствует, его значение по умолчанию считается равным no [8].
Примеры с использованием атрибута:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
Для объявления типа документа существует специальная инструкция !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>
Здесь же разметка была объявлена локально в инструкции !DOCTYPE .
Инструкции обработки (англ. processing instruction, PI), позволяют размещать в документе инструкции для приложений.
В следующем примере показана инструкция обработки xml-stylesheet, передающая xml-stylesheet-приложению (например, браузеру) инструкции в файле my-style.css посредством атрибута href:
<?xml-stylesheet type="text/css" href="my-style.css"?>
Комментарии (англ. comment) не относятся к символьным данным документа.
Комментарий начинается последовательностью «», внутри не может встречаться комбинация символов «--». Символ & не используется внутри комментария в качестве разметки.
Пример:
<!-- это комментарий -->
Корневой элемент
Элемент (англ. element) является понятием логической структуры документа. Каждый документ содержит один или несколько элементов. Границы элементов представлены начальным и конечным тегами. Имя элемента в начальном и конечном тегах элемента должно совпадать. Элемент может быть также представлен тегом пустого элемента, то есть не включающего в себя другие элементы и символьные данные.
Тег (англ. tag) — конструкция разметки, которая содержит имя элемента.
Начальный тег: <element1>
Конечный тег: </element1>
Тег пустого элемента: <empty_element1 />
В элементе атрибуты могут использоваться только в начальном теге и теге пустого элемента.
Пример кулинарного рецепта, размеченного с помощью XML:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE recipe>
<recipe name="хлеб" preptime="5min" cooktime="180min">
<title>
Простой хлеб
</title>
<composition>
<ingredient amount="3" unit="стакан">Мука</ingredient>
<ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
<ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
</composition>
<instructions>
<step>
Смешать все ингредиенты и тщательно замесить.
</step>
<step>
Закрыть тканью и оставить на один час в тёплом помещении.
</step>
<!--
<step>
Почитать вчерашнюю газету.
</step>
- это сомнительный шаг...
-->
<step>
Замесить ещё раз, положить на противень и поставить в духовку.
</step>
</instructions>
</recipe>
Секция CDATA используется для включения фрагментов текста, в которых символы < , > и & должны интерпретироваться как обычные символы, а не как разметка.
Секция может встречаться в любом месте документа, где допускаются символьные данные. Она начинается последовательностью <![CDATA[ и завершается последовательностью ]]> .
Между этими ограничителями может находиться любой текст, который будет обработан как символьные данные, без интерпретации встроенных разметочных символов[13].
Корректный документ
Корректный (англ. well-formed) документ соответствует всем общим правилам синтаксиса XML, применимым к любому XML-документу: правильная структура документа, совпадение имен в начальном и конечном теге элемента и т. п. Документ, который неправильно построен, не может считаться документом XML.
Пространства имён
Пример документа:
<?xml version="1.0" encoding="UTF-8"?>
<!-- login screen -->
<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 kullanc ismi@@,@@Ltfen kullanc ismini doru 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@@,@@Ltfen parolanz doru giriniz.@@
</action>
<action cmd="enablenbb">
back
</action>
<action cmd="waittrigger">
btnback
</action>
<action cmd="jump">
start
</action>
</sequence>
</trigger>
<!-- generic triggers -->
<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>
<!-- An unhandled exception is thrown from the hard code side. -->
<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 srasnda 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
Преобразование документа XML
Для решения задачи преобразования документа XML в другую схему или другой формат предназначен язык XSLT.
Формат для визуализации документа
Для форматированного документа (документа, подготовленного к визуализации) предназначен формат XSL-FO.
Языки запросов
XPath — синтаксис для адресации содержимого документа, представленного в форме дерева. Выражения XPath используются в языке XQuery.
Выражения XPath, вообще говоря, могут использоваться в любом контексте, где уместно использовать формальные ссылки на элементы дерева, в частности, в качестве параметров методов интерфейсов доступа к документу.
XQuery — язык программирования, ориентированный на работу с документами.
Чтение XML: три варианта API
Для чтения XML есть три варианта API[14].
Событийный API (event-driven API, push-style API) — XML-процессор читает XML; при определённом событии (появлении открывающего или закрывающего тега, текстовой строки, атрибута) вызывается callback-функция.
- + Расходует мало памяти[14].
- + При обработке огромного XML есть стандартная точка, позволяющая мгновенно остановить обработчик[14].
- Крайне сложен для прикладного программиста: приходится держать в памяти информацию, в каком месте документа мы находимся.
- + Библиотека проста в программировании.
- Только последовательный доступ к XML[15], это затрудняет разбор перекрёстных ссылок и «почти правильных» XML с перепутанным порядком элементов.
- API только для чтения, для записи потребуется другой API[16].
- ± Естественный выбор, когда из огромного XML надо извлечь немного данных[14].
- ± Естественный выбор, когда XML надо преобразовать в структуру предметной отрасли[14].
- Примеры библиотек: SAX, Expat.
<?xml version="1.0" encoding="UTF-8" ?>
<document>
<thing name="A">Alpha</thing>
<thing name="B">Bravo</thing>
</document>
|
|