Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_XML.doc
Скачиваний:
16
Добавлен:
03.05.2019
Размер:
3.94 Mб
Скачать

3.7. Задание содержимого элемента

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

<?xml version="1.0"?>

<!DOCTYPE BOOK

[

<!ELEMENT BOOK (TITLE, AUTHOR)>

<!ELEMENT TITLE (#PCDATA}>

<!ELEMENT AUTHOR (#PCDATA)>

]

>

<BOOK>

<TITLE>Письмо Скарлет</TITLE>

<AUTHOR>Натаниэл Хоуторн</AUTHOR>

</BOOK>

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

  • Последовательная. Последовательная форма модели содержимого указывает, что элемент должен иметь заданную последовательность дочерних элементов. Вы отделяете имена типов дочерних элементов запятыми. Например, следующее DTD указывает, что элемент MOUNTAIN должен иметь один дочерний элемент NAME, после которого идет один дочерний элемент HEIGHT, за которым следует один дочерний элемент STATE:

<!DOCTYPE MOUNTAIN

[

<!ELEMENT MOUNTAIN (NAME, HEIGHT, STATE)>

<!ELEMENT NAME (#PCDATA)>

<!ELEMENT HEIGHT (#PCDATA)>

<!ELEMENT STATE (#PCDATA)>

]

>

Следовательно, следующий элемент Документ будет валидным:

<MOUNTAIN>

<NAME>Эльбрус</NAME>

<HEIGHT>5600 м</HEIGHT>

<STATE>Кавказ</STATE>

</MOUNTAIN>

Следующий элемент Документ, однако, не будет валидным, поскольку порядок дочерних элементов не соответствует объявленному:

<MOUNTAIN> <!-- Неправильный элемент! -->

<STATE>Кавказ</STATE>

<NAME>Эльбрус</NAME>

<HEIGHT>5600 м<HEIGHT>

</MOUNTAIN>

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

  • Выборочная. Выборочная форма модели содержимого указывает, что элемент может иметь любой из серии допустимых дочерних элементов, разделяемых символом “|”. Например, следующее DTD указывает, что элемент FILM может состоять из одного дочернего элемента STAR, или одного дочернего элемента NARRATOR, или одного дочернего элемента INSTRUCTOR:

<!DOCTYPE FILM 

[

<!ELEMENT FILM (STAR | NARRATOR | INSTRUCTOR)>

<!ELEMENT STAR (#PCDATA)>

<!ELEMENT NARRATOR (#PCDATA)>

<!ELEMENT INSTRUCTOR (#PCDATA)>

]

>

Следовательно, следующий элемент Документ будет валидным:

<FILM>

<STAR>Роберт Рэдфорд</STAR>

</FILM>

как и элемент:

<FILM>

<NARRATOR>Сэр Грэгори Парслоу</NARRATOR>

</FILM>

а также элемент:

<FILM>

<INSTRUCTOR>Галахед Трипвуд</INSTRUCTOR>

</FILM>

Следующий элемент Документ не будет валидным, поскольку можно включить только один из дочерних элементов:

<FILM> <!-- Неправильный элемент! -->

<NARRATOR>Сэр Грэгори Парслоу</NARRATOR>

<INSTRUCTOR>Галахед Трипвуд</INSTRUCTOR>

</FILM>

Можно изменить любую из этих форм модели содержимого, используя знак вопроса (?), знак плюс (+) и звездочку (*), значения которых описаны в следующей таблице:

Символ

Значение

?

Ни одного или один из предшествующих элементов

+

Один или несколько из предшествующих элементов

*

Ни одного или несколько из предшествующих элементов

Например, следующее объявление означает, что можно включить один или более дочерних элементов NAME, и что дочерний элемент HEIGHT является не обязательным:

<!ELEMENT MOUNTAIN (NAME+, HEIGHT?, STATE)>

Таким образом, следующий элемент будет правильным:

<MOUNTAIN>

<NAME>Пик Пуэбло</NAME>

<NAME>Вершина Таос</NAME>

<STATE>Нью Мексико</STATE>

</MOUNTAIN>

Другой пример: следующее объявление означает, что можно включить несколько или ни одного дочернего элемента STAR, либо один дочерний элемент NARRATOR, либо один дочерний элемент INSTRUCTOR:

<!ELEMENT FILM (STAR* | NARRATOR | INSTRUCTOR)>

Соответственно, каждый из следующих трех элементов будет корректным:

<FILM>

<STAR>Том Хэнкс</STAR>

<STAR>Мэг Райан</STAR>

</FILM>

<FILM>

<NARRATOR>Сэр Грэгори Парслоу</Narrator>

</FILM>

<FILM/>

Также можно воспользоваться символами ?, + или * для модификации всей модели содержимого, помещая символы непосредственно после закрывающих скобок. Например, следующее объявление дает возможность включить один или несколько дочерних элементов любого из этих трех типов в любом порядке:

<!ELEMENT FILM (STAR | NARRATOR | INSTRUCTOR)+>

Такое объявление делает корректными следующие элементы:

<FILM>

<NARRATOR>Бертрам Вустер</NARRATOR>

<STAR>Шон Коннери</STAR>

<NARRATOR>Плаг Бешам</NARRATOR>

</FILM>

<FILM>

<STAR>Шон Коннери</STAR>

<STAR>Мэг Райан</STAR>

</FILM>

<FILM>

<INSTRUCTOR>Стринкер Пайк</INSTRUCTOR>

</FILM>

Наконец, можно формировать более сложные модели содержимого путем вложения выборочной модели содержимого внутрь последовательной модели, либо последовательной модели в выборочную модель. Например, следующее DTD задает, что каждый элемент FILM должен иметь один дочерний элемент TITLE; за ним должен следовать один дочерний элемент CLASS; после него должен идти один дочерний элемент STAR, NARRRATOR или INSTRUCTOR:

<!DOCTYPE FILM

[

<!ELEMENT FILM (TITLE, CLASS, (STAR | NARRATOR | INSTRUCTOR) )>

<!ELEMENT TITLE (#PCDATA)>

<!ELEMENT CLASS (#PCDATA)>

<!ELEMENT STAR (#PCDATA)>

<!ELEMENT NARRATOR (#PCDATA)>

<!ELEMENT INSTRUCTOR (#PCDATA)>

]

>

В соответствии с этим DTD, следующий элемент Документ будет корректным:

<FILM>

<TITLE>Сеть</TITLE>

<CLASS>фиксированный</CLASS>

<STAR>Сандра Баллок</STAR>

</FILM>

так же, как такой:

<FILM>

<TITLE>Как использовать XML</TITLE>

<CLASS>Инструкции<C/LASS>

<INSTRUCTOR>Преподаватель</INSTRUCTOR>

</FILM>