ОПИСАНИЕ МОДЕЛИ СОДЕРЖАНИЯ XML ДОКУМЕНТОВ

Г.Е. Берман berman@tversu.ru

Общие положения. 1

Правила описания моделей содержания. 3

Описание модели содержания примера. 5

 

Данная работа является второй частью лекции Document Type Definition курса "Технологии XML", который читает автор студентам кафедры "Информационных систем и технологий" факультета "Прикладной математики" Тверского государственного университета.

Общие положения

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

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

          Для более ясного понимания вопроса рассмотрим его на примере. На рис. 1 представлена структурная организация учебного подразделения гипотетического университета.

                              Рис.1

Соответствующей данной структуре XML документ будет иметь вид:

          <university>

                  <u_name>название университета</u_name>

                  <courses>

                      <course>

                         <number>номер курса</number>

                        <groups>

                           <group>

                               <g_name>название группы</g_name>

                               <g_number>номер группы</g_number>

                               <students>

                                        <student>

                                            <s_name>Иванов</s_name>

                                            <rating>3,9</rating>

<description> …текст характеристика на Иванова…                             </ description >

                                       </student>

                                       …..

                                        <student>

                                          <s_name>Петров</s_name>

                                           <rating>4,6</rating>

                                           <description> …текст характеристики на Петрова…

                                           </ description >

                                       </student>

                               </students>

                          </group>

                      <groups>

                   </course>              

                 </courses>

          </university>

В данном примере тег <university> будет внешним контейнером документа, тег  <courses> будет контейнером первого уровня, тег <course> будет контейнером второго уровня относительно тега  <courses> и т.д.

Первое, что необходимо сделать при формировании структуры документа – это определить условия вложения элементов:

·       может ли данный элемент входить в другие элементы;

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

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

Правила описания моделей содержания

По своей сути модель содержания – это часть объявления элемента в DTD (Document Type Definition, описание типа документа), описывающая порядок вложения контейнеров, их состав и типы элементов в контейнере.

Модель содержания описывается в DTD с помощью предложения ELEMENT следующего формата:

<! ELEMENT имя_элемента (модель содержания)>

В модель содержания могут включаться элементы одного из четырех типов:

·       элементный;

·       текстовый;

·       смешанный;

·       произвольный.

Такая классификация типов содержания элементов обусловлена возможностью включения текстовой информации в элемент.

Элементный тип содержания не может включать текст, а может состоять только из элементов. В представленном примере к данному типу относятся, например, элементы courses, groups.

Текстовый тип содержания состоит только из одного текста. В представленном примере к данному типу относятся, например, элементы u_name, s_name. Характеризуется словом #PCDATA в поле модели содержания.

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

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

Модель содержания позволяет для элементного типа не только указать какие элементы будут содержаться в его контейнере, но задать их порядок и множественность (ни разу, один раз, много раз) вложений. Для задания множественности вложений используется набор определенных символов:

·       "," (запятая) – разделяет типы элементов при их перечислении в модели содержания;

·       "|" (вертикальная черта) – разделяет элементы при их перечислении в смешанном элементе;

·       "+" (знак плюс) – определяет, что элемент будет использоваться один или несколько раз;

·       "?" (вопросительный знак) – определяет, что элемент не будет использоваться вообще или будет использоваться только один раз;

·       "*" (звездочка) – определяет, что элемент не будет использоваться вообще или может использоваться несколько раз.

 Описание модели содержания примера

Рассмотрим, как же будет выглядеть модель содержания нашего примера в DTD.

Примечание 1. Цифры слева не являются часть модели содержания, а служат только для облегчения идентификации строк при пояснении примера.

Примечание 2. Предполагается для пояснения смешанного типа элемента, что текст в контейнере <description> </ description > имеет элементы формирования списков (li, ol, ul) аналогичные тем, которые применяются в документах HTML.

 

1

<! ELEMENT  university (u_name, courses)>

2

<! ELEMENT u_name (#PCDATA)>

3

<! ELEMENT courses (course+)>

4

<! ELEMENT course (number, groups)>

5

<! ELEMENT number (#PCDATA)>

6

<! ELEMENT groups (group+)>

7

<! ELEMENT group ( (g_name | g_number), students)>

8

<! ELEMENT g_name (#PCDATA)>

9

<! ELEMENT g_number (#PCDATA)>

10

<! ELEMENT students (student*)>

11

<! ELEMENT student (s_name, rating?, description?)+>

12

<! ELEMENT s_name (#PCDATA)>

13

<! ELEMENT rating (#PCDATA)>

14

<! ELEMENT description (#PCDATA | ul | ol | li)*>

15

<! ELEMENT ul (li+)>

16

<! ELEMENT ol (li+)>

17

<! ELEMENT li (#PCDATA | ul | ol)*>

 

Строка 1 описывает university (университет), как элементный тип, содержащий два типа элементов u_name и courses, которые обязательно должны быть и только один раз.

Строка 2 описывает элемент u_name (название университета) как текстовый тип.

Строка 3 описывает courses (курсы), как элементный тип, содержащий тип элемента course, который обязательно должен быть и может повторяться несколько раз.

Строка 4 описывает course (курс), как элементный тип, содержащий два типа элементов number и groups, которые обязательно должны быть и только один раз.

Строка 5 описывает элемент number (номер курса) как текстовый тип.

Строка 6 описывает groups (группы), как элементный тип, содержащий тип элемента group, который обязательно должен быть и может повторяться несколько раз.

 

Строка 7 описывает group (группа), как элементный тип, содержащий три типа элементов g_name, g_number и students. Согласно сделанного описания, предполагается, что группа идентифицируется либо именем, либо номером.  Тип элемента students обязательно должен быть и только один раз.

Строка 8 описывает элемент g_name (имя группы) как текстовый тип.

Строка 9 описывает элемент g_number (номер группы) как текстовый тип.

Строка 10 описывает students (студенты), как элементный тип, содержащий тип элемента student, который может и не быть (например, группа открыта, но не сформирована), а если есть, то может повторяться несколько раз.

Строка 11 описывает student (студент), как элементный тип, содержащий три элемента, причем элементы rating (средний бал) и description (характеристика) могут использоваться один раз или вовсе не использоваться, например, при описании первокурсников.

Строка 12 описывает элемент s_name (имя студента) как текстовый тип.

Строка 13 описывает элемент rating (средний бал студента) как текстовый тип.

Строка 14 описывает элемент description (характеристика студента) как смешанный тип. В приведенном примере при написании характеристики допускается использовать списки.

Строки 15-17  описывают списки посредством элементов ui, oi, li, причем элемент li может включать в себя текст и вложенный список.

 

 

 

 

 

Используются технологии uCoz