XML решает ряд проблем, которые не решает HTML, например:
В зависимости от уровня соответствия стандартам документ может быть "верно сформированным" ("well-formed"), либо "валидным" ("valid"). Вот несколько основных правил создания верно сформированного документа:
Есть три основных способа сообщить браузеру, как отображать каждый из созданных вами XML-элементов:
Индивидуальный пользователь, компания или комитет по стандартам может определить необходимый набор элементов XML и структуру документа, которые будут применяться для особого класса документов. Подобный набор элементов и описание структуры документа называют XML-приложением или XML-словарём.
XML-приложение обычно определяется созданием описателя типа документа (DTD), который является допустимым компонентом XML-документа. DTD устанавливает и определяет имена элементов, которые могут быть использованы в документе, порядок, в котором элементы могут появляться, и доступные к применению атрибуты элементов. DTD обычно включается в XML-документ и ограничивает круг элементов и структур, которые будут использоваться. Примечание: приложение XML Schema позволяет разрабатывать подробные схемы для ваших XML-документов с использованием стандартного синтаксиса XML и является альтернативой DTD.
Простейший XML-документ состоит из двух частей: пролога и корневого элемента. Пролог содержит объявление XML, указывающее на то, что это XML-документ, и содержит номер версии XML. Пролог может также содержать необязательные компоненты:
XML-документ может содержать комментарии, начинающиеся с символов "<!--" и заканчивающиеся символами "-->". Комментарий может содержать любой текст, за исключением символов "--". Тексты комментариев доступны для написанного внутри HTML-страницы кода сценария.
XML-документ можно набрать в любом текстовом редакторе, сохранив документ как текстовый файл с расширением .xml.
В дальнейшем такой документ будет открываться двойным щелчком в Internet Explorer. Вот пример простейшего
XML-документа:
<?xml version="1.0"?>
<!-- Comment -->
<PRODUCTS>
<PRODUCT>
<TITLE> Product #1 </TITLE>
<PRICE> 10.00 </PRICE>
</PRODUCT>
<PRODUCT>
<TITLE> Product #2 </TITLE>
<PRICE> 20.00 </PRICE>
</PRODUCT>
</PRODUCTS>
Чтобы иметь возможность использовать в XML-документе символы кириллицы (как в символьных данных, так и в именах
элементов), вы можете указать кодировку в прологе:
<?xml version="1.0" encoding="windows-1251"?>
Приведённая ниже каскадная таблица стилей (Cascading Style Sheet - CSS) отобразит каждый элемент PRODUCT
XML-документа с переводом строки сверху и снизу, каждый элемент TITLE - курсивом, а каждый элемент PRICE -
полужирным шрифтом. Наберите таблицу стилей в любом текстовом редакторе, сохранив документ как текстовый файл с
расширением .css:
/* Comment */
PRODUCT {display:block;}
TITLE {font-style:italic;}
PRICE {font-weight:bold;}
В конце пролога XML-документа необходимо добавить инструкцию по обработке:
<?xml-stylesheet type="text/css" href="Sample.css"?>
В результате при открытии XML-документа в Internet Explorer он будет отображён в соответствии с инструкциями, записанными в таблице стилей.
В начальный тэг элемента либо в тэг пустого элемента вы можете включить одно или несколько описаний атрибутов.
Описание атрибута представляет собой пару имя - значение, например:
<PRICE type="retail">$10.55</PRICE>
или
<PRICE type="retail" />
Если XML-документ отображается с помощью таблицы стилей CSS, браузер не выводит атрибуты и их значения. Доступ к атрибутам и их значениям даёт отображение XML-документа с использованием XSL-таблицы, связывания данных или сценария (см. выше описание способов отображения XML-документа).
Инструкция по обработке имеет следующую форму записи:
<? кому инструкция ?>
Здесь "кому" есть имя приложения, которому адресована инструкция, а "инструкция" - есть информация, передаваемая приложению. Инструкция может состоять из любой последовательности символов, кроме пары ?>.
Если вы используете в качестве XML-процессора Internet Explorer, у вас есть две возможности применения инструкций по обработке:
Вы можете поместить инструкцию по обработке в любое место XML-документа вне других элементов разметки: в пролог
документа, после корневого элемента, либо внутри содержимого элемента:
<PRODUCT> ... <?MyScript detail="2"?> ... </PRODUCT>
Внутри символьных данных в содержимом элемента нельзя помещать символы угловых скобок (например, <) или знак амперсанда &. Одним из способов преодолеть это ограничение является использование ссылки на символ (< или &). Другим способом является использование ссылки на предопределённый общий примитив (< или &). Однако, в случае, если вам требуется многократно вставлять символы < и & (если, например, это какой-либо исходный код или разметка HTML), использование ссылок неудобно и затрудняет восприятие данных. В этом случае проще поместить текст, содержащий такие символы, в раздел CDATA.
Раздел CDATA начинается с символов <![CDATA[ и заканчивается символами ]]>. Между этими двумя ограничителями
вы можете поместить любые символы, кроме ]]>. В разделе CDATA не нужно использовать ссылки на символы или
предопределённые общие примитивы, т.к. синтаксический анализатор не будет замещать такую ссылку соответствующим
символом. Разделы CDATA не могут быть вложенными. Вы можете поместить раздел CDATA в любое место, занимаемое
символьными данными - т.е. внутри содержимого элемента, но не внутри XML-разметки:
<PRODUCT> ... <![CDATA[ Text: <&> ]]> ... </PRODUCT>
Разделы CDATA отображаются браузером как содержимое элемента.
Валидным (valid) называется корректно сформированный (well-formed) документ, отвечающий двум дополнительным требованиям:
Любое отклонение от требований корректности формирования (well-formed) считается фатальной ошибкой (fatal error). Если XML-процессор сталкивается с фатальной ошибкой, он останавливает обработку документа и не пытается её возобновить. Отклонение от требований валидности (valid) считается лишь ошибкой (error). Если XML-процессор сталкивается с ошибкой, он может просто выдать сообщение о ней и продолжить обработку. Процессор Internet Explorer проверяет документ на валидность только в том случае, если вы открываете документ через HTML Web-страницу.
Большинство так называемых XML-приложений (XML-словарей) состоят из стандартного DTD, которое все пользователи приложения включают в свои XML-документы.
Объявление типа документа (DTD) представляет собой блок разметки, который вы должны добавить в пролог XML-документа,
и имеет следующую форму записи:
<!DOCTYPE Имя DTD>
Здесь "Имя" указывает на имя корневого элемента. "DTD" содержит объявления, задающие элементы и их атрибуты. "DTD"
состоит из символа левой квадратной скобки, после которой следует ряд объявлений разметки, заканчивающийся правой
квадратной скобкой. Пример:
<!DOCTYPE PRODUCTS
[
<!ELEMENT PRODUCT ANY>
]
>
DTD может содержать следующие типы объявлений разметки:
Объявление типа элемента имеет следующую форму:
<!ELEMENT Имя Опись_содержимого>
Здесь "Имя" есть имя объявляемого типа элемента. "Опись_содержимого" можно заполнить четырьмя различными способами:
В третьем случае (когда "Опись содержимого" представляет из себя "дочернее содержимое элемента") модель содержимого может иметь одну из следующих форм:
Вы можете изменить любую из этих форм модели содержимого, используя знаки:
? | Ни одного или один из предшествующих элементов. |
+ | Один или несколько из предшествующих элементов. |
* | Ни одного или несколько из предшествующих элементов. |
Например, следующее объявление означает, что вы можете включить один или более дочерних элементов TITLE, и что
дочерний элемент PRICE является необязательным:
<!ELEMENT PRODUCT (TITLE+, PRICE?, MASS)>
Следующее объявление означает, что вы можете включить несколько или ни одного дочерних элементов TITLE,
либо один дочерний элемент PRICE, либо один дочерний элемент MASS:
<!ELEMENT PRODUCT (TITLE* | PRICE | MASS)>
Следующее объявление означает, что вы можете включить один или несколько дочерних элементов любого из этих
трёх типов в любом порядке:
<!ELEMENT PRODUCT (TITLE | PRICE | MASS)+>
Следующее объявление означает, что каждый элемент PRODUCT должен иметь один дочерний элемент
TITLE; за ним должен следовать один дочерний элемент PRICE; после него должен идти один дочерний элемент MASS,
NET или GROSS:
<!ELEMENT PRODUCT (TITLE, PRICE, (MASS | NET | GROSS))+>
В четвёртом случае (когда "Опись содержимого" представляет из себя "смешанное содержимое") элемент может включать символьные данные. При смешанном содержимом вы можете задавать типы дочерних элементов, но не можете задавать порядок и количество вхождений дочерних элементов. Модель смешанного содержимого может иметь одну из следующих форм:
Объявление списка атрибутов определяет имена атрибутов, устанавливает тип для каждого атрибута и задаёт
востребованность для каждого атрибута, в частности, может задавать значение атрибута по умолчанию. Объявление
списка атрибутов имеет следующую форму записи:
<!ATTLIST Имя ОпрАтр>
Здесь "Имя" - имя элемента, для которого задаются атрибуты. "ОпрАтр" - это одно или несколько определений атрибутов.
Определение атрибута имеет следующую форму записи:
Имя ОпрАтр ОбъявУмолч
Здесь "Имя" - имя атрибута. ОпрАтр представляет собой тип атрибута. ОбъявУмолч - это объявление значения по
умолчанию, которое указывает на востребованность атрибута и содержит некоторую дополнительную информацию. Пример
объявления:
<!ATTLIST PRODUCT Retail CDATA "retail" Title CDATA #REQUIRED>
Вышеприведённое объявление означает, что вы можете присвоить атрибуту Retail любую строку в кавычках (ключевое слово CDATA); если этот атрибут опущен, ему будет присвоено значение по умолчанию "retail". Вы можете присвоить атрибуту Title любую строку в кавычках; этот атрибут должен быть обязательно задан для каждого элемента PRODUCT (ключевое слово #REQUIRED) и не имеет значения по умолчанию.
Объявления атрибутов просто включаются в DTD наряду с объявлениями типов элементов, например:
...
<!ELEMENT PRODUCT (#PCDATA)>
<!ATTLIST PRODUCT Retail CDATA "retail" Title CDATA #REQUIRED>
...
Вы можете задавать тип атрибута тремя различными способами:
Вот список ключевых слов, которые вы можете использовать в определении маркерных типов атрибутов:
ID | Для каждого элемента атрибут должен иметь уникальное значение. Элемент может иметь только один атрибут типа ID. В объявлении значения по умолчанию такого атрибута должно фигурировать #REQUIRED или #IMPLIED. |
IDREF | Значение такого атрибута является ссылкой на атрибут типа ID другого элемента . |
IDREFS | Этот тип атрибута похож на IDREF, но его значение может включать ссылки на несколько идентификаторов - разделённых пробелами - внутри строки в кавычках. |
ENTITY | Значение атрибута должно совпадать с именем примитива, объявленного в DTD. Такой примитив ссылается на внешний файл, обычно содержащий не XML-данные. Таким способом, например, определяют путь к файлу, содержащему графические данные (рисунок). |
ENTITIES | Этот тип атрибута похож на ENTITY, но его значение может включать ссылки на несколько идентификаторов, разделённых пробелами - внутри строки в кавычках. Таким способом, например, определяют пути к файлам, содержащим графические данные (рисунки) в альтернативных форматах. |
NMTOKEN | Элементарное имя. |
NMTOKENS | Этот тип атрибута похож на NMTOKEN, но его значение может включать несколько элементарных имён, разделённых пробелами - внутри строки в кавычках.. |
Два способа, которые вы можете использовать в определении нумерованных типов атрибутов:
Объявление значения атрибута по умолчанию может иметь четыре формы:
#REQUIRED | Вы должны задать значение атрибута для каждого элемента. |
#IMPLIED | Вы можете опустить атрибут, но никакое значение по умолчанию назначено не будет. |
AttValue | Собственно значение по умолчанию. Вы можете опустить атрибут, и ему будет назначено это значение по умолчанию. |
#FIXED AttValue | Вы можете опустить атрибут, и ему будет назначено это значение по умолчанию (AttValue). Если вы не опускаете атрибут, вы обязаны назначить ему это значение по умолчанию. При таком объявлении указывать атрибут в элементе имеет смысл только для того, чтобы сделать документ более понятным для восприятия. |
Вы можете поместить все или часть объявлений DTD документа в отдельный файл, а затем ссылаться на этот файл из объявления типа документа. DTD, или часть DTD, содержащаяся в отдельном файле, называется внешним подмножеством DTD. Применение внешнего подмножества DTD имеет смысл для DTD, которые являются общими для группы документов.
Ссылка на внешний DTD выглядит следующим образом:
<!DOCTYPE PRODUCTS SYSTEM "Products.dtd"
[
...
]
>
Файл, содержащий внешнее подмножество DTD, может включать любые объявления разметки, которые могут быть включены во
внутреннее подмножество DTD. Например, содержимое файла "Products.dtd" может выглядеть так:
<!ELEMENT PRODUCT ANY>
XML-процессор осуществляет слияние внутреннего и внешнего подмножества DTD. Если одно и то же объявление встречается более одного раза, XML-процессор использует первое объявление и игнорирует все последующие. Внутреннее подмножество DTD имеет приоритет перед внешним (т.е. внешнее подмножество DTD всегда обрабатывается после того, как полностью будет обработано подмножество внутреннего DTD). Такой способ объединения DTD даёт вам возможность адаптировать (или субклассировать) DTD для конкретного документа.
Вы можете заставить XML-процессор игнорировать часть внешнего DTD с помощью раздела IGNORE. Такой приём подобен
"комментированию" фрагмента кода:
<!ELEMENT PRODUCT ANY>
<![IGNORE[
<!-- Comment -->
<!ELEMENT TITLE ANY>
]]>
Если вы хотите временно восстановить блок разметки в разделе IGNORE, достаточно просто заменить ключевое слово IGNORE на INCLUDE, не удаляя при этом символы-ограничители разметки, чтобы потом можно было быстро опять "закомментировать" код.
Примечание: разделы IGNORE и INCLUDE можно использовать только во внешнем DTD.
Термин "примитив" в широком смысле относится к любому из следующих типов единиц хранения информации для XML-документов:
Однако чаще термин "примитив" используется в узком смысле, а именно - в двух последних смыслах.
Механизм примитивов может оказаться удобным для сокращения времени набора документа, а также может облегчить внесение изменений в документ. Кроме того, механизм примитивов необходим при включении не XML-данных в XML-документ. В принципе, механизм примитивов сходен с определением констант в различных языках программирования.
Примитивы классифицируются по трём признакам:
Реально в XML поддерживается пять типов примитивов:
Примитив создаётся путём объявления его в DTD документа.
Объявление общего внутреннего разбираемого примитива имеет следующую форму записи:
<!ENTITY Имя Значение>
Здесь "Имя" есть имя примитива. Примитив может иметь такое же имя, что и другой параметрический примитив в документе, т.к. общие и параметрические примитивы занимают различные пространства имён. Примитив также может иметь такое же имя, что и элемент или атрибут. "Значение" есть строка, заключённая в кавычки (литерал). Строка не может содержать символы амперсанда (&) и процентов (%). Содержимое строки должно быть корректным для места, в которое вы предполагаете вставить примитив.
Пример:
...
<!ENTITY title
"Groceries
<SUBTITLE>Dry Produce</SUBTITLE>"
>
...
<PRODUCT>
Title: &title
<PRODUCT>
Объявление общего внешнего разбираемого примитива имеет следующую форму записи:
<!ENTITY Имя SYSTEM Литерал>
Здесь "Имя" есть имя примитива. "Литерал" есть путь к файлу, содержащему данные примитива. Вы можете вставить общий внешний разбираемый примитив только внутрь содержимого элемента.
Объявление общего внешнего неразбираемого примитива имеет следующую форму записи:
<!ENTITY Имя SYSTEM Литерал NDATA ИмяНотации>
Здесь "Имя" есть имя примитива. "Литерал" есть путь к файлу, содержащему данные примитива. Ключевое слово NDATA указывает, что файл примитива содержит неразбираемые данные (они не обрабатываются синтаксическим анализатором). "ИмяНотации" есть имя нотации, объявленной в DTD.
Файл неразбираемого внешнего примитива может содержать любой тип текста или нетекстовые данные. Фактически единственный способ использования этого типа примитива состоит в присвоении его имени атрибуту с типом ENTITY или ENTITIES. Процессор просто делает примитив и его нотацию доступными приложению, которое может выполнять необходимые действия с этой информацией (например, он может запустить программу, ассоциированную с нотацией, и указать ей отобразить данные из файла примитива).
Пример:
...
<!ENTITY faun SYSTEM "Faun.gif" NDATA GIF>
...
<COVERIMAGE Source="faun" />
Нотация описывает определённый формат данных. Это делается путём указания адреса описания формата, адреса программы, которая может обрабатывать данные в этом формате, либо указания просто описания формата. Вы можете использовать нотацию, чтобы описать формат общего внешнего неразбираемого примитива, либо можете присвоить нотацию атрибуту, который имеет нумерованный тип NOTATION.
Нотация имеет следующую форму записи:
<!NOTATION Имя SYSTEM Литерал>
Здесь "Имя" есть имя нотации. "Литерал" есть строка, куда вы можете включить любое описание формата, которое проинформирует приложение, как отображать или обрабатывать документ. Например, вы можете включить в литерал одно из следующих описаний:
Объявление параметрического внутреннего разбираемого примитива имеет следующую форму записи:
<!ENTITY % Имя Значение>
Здесь "Имя" есть имя примитива. Примитив может иметь такое же имя, что и общий примитив в документе, т.к. параметрические и общие примитивы занимают различные пространства имён. Имя примитива также может совпадать с именем элемента или атрибута. "Значение" есть литерал, который не может содержать символа процентов (%) и символа амперсанда (&), если это не начальный символ в ссылке на символ или общий примитив. Строка "Значение" должна содержать одно или несколько объявлений разметки, которые разрешено использовать в DTD.
Пример DTD:
<!DOCTYPE PRODUCTS
[
<!ENTITY % contents "
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>">
<!ELEMENT PRODUCT (TITLE, PRICE)>
%contents;
]
>
Приведённое выше DTD эквивалентно следующему:
<!DOCTYPE PRODUCTS
[
<!ELEMENT PRODUCT (TITLE, PRICE)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
]
>
Объявление параметрического внешнего разбираемого примитива имеет следующую форму записи:
<!ENTITY % Имя SYSTEM Литерал>
Здесь "Имя" есть имя примитива. "Литерал" есть путь к файлу, содержащему данные примитива. Файл параметрического внешнего разбираемого примитива должен содержать полные объявления разметки любых типов, допустимых в DTD.
Вы можете использовать параметрические внешние разбираемые примитивы для хранения группы взаимосвязанных объявлений. Это позволит вам объединять эти группы объявлений различными способами. Параметрический внешний разбираемый примитив работает во многом аналогично внешнему подмножеству DTD, но обеспечивает большую гибкость - вы можете включать несколько файлов внешних объявлений, причём в любом порядке.
Ссылка на общий примитив имеет следующую форму записи:
&ИмяПримитива;
Ссылка на параметрический примитив имеет следующую форму записи:
%ИмяПримитива;
В представленной ниже таблице приведены формы записи ссылок на примитивы и перечень возможных мест их помещения:
Тип примитива | Форма записи ссылки | Места помещения |
---|---|---|
Общий внутренний разбираемый | &ИмяПримитива; | Содержимое элемента, значение атрибута (в т.ч. объявление значения по умолчанию), значение в объявлении внутреннего примитива. |
Общий внешний разбираемый | &ИмяПримитива; | Содержимое элемента. |
Общий внешний неразбираемый | Атрибут='ИмяПримитива' | Значение атрибута, имеющего тип ENTITY или ENTITIES (в т.ч. в объявлении внутреннего примитива). |
Параметрический внутренний разбираемый | %ИмяПримитива; | В DTD, но не внутри объявлений разметки. |
Параметрический внешний разбираемый | %ИмяПримитива; | В DTD, но не внутри объявлений разметки. |
Ссылка на символ | &#Число; &#xЧисло; |
Содержимое элемента, значение атрибута (в т.ч. объявление значения по умолчанию), значение в объявлении внутреннего примитива. "Число" - десятичный или шестнадцатеричный код символа. |
Для вставки ссылок на символы используется международная таблица символов ISO-IEC 10646, содержащая символы многих языков. Например, © или © соответствуют символу ©. Коды первых 128 символов совпадают с кодами набора ASCII.
Кроме того, в XML-документе вы можете использовать ссылку на предопределённый примитив, чтобы вставить следующие
четыре стандартных символа:
& | & | & |
< | < | < |
> | > | > |
" | " | " |
Людоговский Александр