к библиотеке   к оглавлению   Банки данных Интернет   визуальные среды - 4GL   технологии программирования

Синтаксис языка XML, создание валидных документов

  1. Простейший XML-документ
  2. Отображение XML-документа с помощью CSS
  3. Задание атрибутов элементов
  4. Инструкции по обработке
  5. Использование разделов CDATA
  6. Создание валидных XML-документов
  7. Объявления типов элементов
  8. Объявления атрибутов
  9. Использование внешних DTD
  10. Пример валидного XML-документа
  11. Использование примитивов
  12. Использование общих примитивов и нотаций
  13. Использование параметрических примитивов
  14. Вставка ссылок на примитивы в XML-документ
XML - это расширяемый язык разметки (Extensible Markup Language), разработанный специально для размещения информации в World Wide Web, наряду с HTML, который давно стал стандартным языком создания Web-страниц. В отличие от HTML, вместо использования ограниченного набора определённых элементов вы имеете возможность создавать ваши собственные элементы и присваивать им любые имена по вашему выбору. Примечание: подразумевается, что читатель данной статьи хотя бы очень поверхностно знаком с языком HTML.

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. Пролог может также содержать необязательные компоненты:

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"?>

Отображение XML-документа с помощью CSS

Приведённая ниже каскадная таблица стилей (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>

Использование разделов CDATA

Внутри символьных данных в содержимом элемента нельзя помещать символы угловых скобок (например, <) или знак амперсанда &. Одним из способов преодолеть это ограничение является использование ссылки на символ (&#60; или &#38;). Другим способом является использование ссылки на предопределённый общий примитив (&lt; или &amp;). Однако, в случае, если вам требуется многократно вставлять символы < и & (если, например, это какой-либо исходный код или разметка HTML), использование ссылок неудобно и затрудняет восприятие данных. В этом случае проще поместить текст, содержащий такие символы, в раздел CDATA.

Раздел CDATA начинается с символов <![CDATA[ и заканчивается символами ]]>. Между этими двумя ограничителями вы можете поместить любые символы, кроме ]]>. В разделе CDATA не нужно использовать ссылки на символы или предопределённые общие примитивы, т.к. синтаксический анализатор не будет замещать такую ссылку соответствующим символом. Разделы CDATA не могут быть вложенными. Вы можете поместить раздел CDATA в любое место, занимаемое символьными данными - т.е. внутри содержимого элемента, но не внутри XML-разметки:

<PRODUCT> ... <![CDATA[ Text: <&> ]]> ... </PRODUCT>

Разделы CDATA отображаются браузером как содержимое элемента.

Создание валидных XML-документов

Валидным (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, которые являются общими для группы документов.

Ссылка на внешний 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 version="1.0"?>

<!-- Comment -->

<!DOCTYPE PRODUCTS
     [
     <!ELEMENT PRODUCTS (PRODUCT)*>
     <!ELEMENT PRODUCT (TITLE, PRICE)>
     <!ELEMENT TITLE (#PCDATA)>
     <!ELEMENT PRICE (#PCDATA)>
     ]
>

<PRODUCTS>
     <PRODUCT>
          <TITLE> Product #1 </TITLE>
          <PRICE> 10.00 </PRICE>
     </PRODUCT>
     <PRODUCT>
          <TITLE> Product #2 </TITLE>
          <PRICE> 20.00 </PRICE>
     </PRODUCT>
</PRODUCTS>

Использование примитивов

Термин "примитив" в широком смысле относится к любому из следующих типов единиц хранения информации для 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, но обеспечивает большую гибкость - вы можете включать несколько файлов внешних объявлений, причём в любом порядке.

Вставка ссылок на примитивы в XML-документ

Ссылка на общий примитив имеет следующую форму записи:

&ИмяПримитива;

Ссылка на параметрический примитив имеет следующую форму записи:

%ИмяПримитива;

В представленной ниже таблице приведены формы записи ссылок на примитивы и перечень возможных мест их помещения:

Тип примитиваФорма записи ссылкиМеста помещения
Общий внутренний разбираемый &ИмяПримитива;   Содержимое элемента, значение атрибута (в т.ч. объявление значения по умолчанию), значение в объявлении внутреннего примитива.
Общий внешний разбираемый &ИмяПримитива;   Содержимое элемента.
Общий внешний неразбираемый Атрибут='ИмяПримитива'   Значение атрибута, имеющего тип ENTITY или ENTITIES (в т.ч. в объявлении внутреннего примитива).
Параметрический внутренний разбираемый %ИмяПримитива;   В DTD, но не внутри объявлений разметки.
Параметрический внешний разбираемый %ИмяПримитива;   В DTD, но не внутри объявлений разметки.
Ссылка на символ &#Число;
&#xЧисло;
  Содержимое элемента, значение атрибута (в т.ч. объявление значения по умолчанию), значение в объявлении внутреннего примитива. "Число" - десятичный или шестнадцатеричный код символа.

Для вставки ссылок на символы используется международная таблица символов ISO-IEC 10646, содержащая символы многих языков. Например, &#169; или &#xA9; соответствуют символу ©. Коды первых 128 символов совпадают с кодами набора ASCII.

Кроме того, в XML-документе вы можете использовать ссылку на предопределённый примитив, чтобы вставить следующие четыре стандартных символа:

&amp;&&#38
&lt;<&#60
&gt;>&#62
&quot;"&#34

Людоговский Александр

к библиотеке   к оглавлению   Банки данных Интернет   визуальные среды - 4GL   технологии программирования

Знаете ли Вы, низкочастотные электромагнитные волны частотой менее 100 КГц коренным образом отличаются от более высоких частот падением скорости электромагнитных волн пропорционально корню квадратному их частоты от 300 тыс. км/с при 100 кГц до примерно 7 тыс км/с при 50 Гц.

Bourabai Research Institution home page

Боровское исследовательское учреждение - Bourabai Research Bourabai Research Institution