![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Форма записи объявления типа элемента
В валидном XML-документе необходимо полностью объявить тип каждого элемента, который используется в документе, в объявлении типа элемента внутри DTD. Объявление типа элемента указывает на имя типа элемента и допустимое содержимое элемента (часто описывающее порядок размещения дочерних элементов). В целом, объявление типа элемента в DTD задает полную логическую структуру документа. Таким обрамим, объявление типа элемента указывает на типы элементов, которые содержит документ, порядок следования элементов, а также описание содержимого элементов. Объявление типа элемента имеет следующую обобщенную форму:
<!ELEMENT Имя опись_содержимого>
Здесь “Имя” есть имя объявляемого типа элемента. “Опись_содержимого” - это описание содержимого, которое определяет, что может содержать элемент. В следующем разделе приведены различные типы описаний содержимого, которые можно использовать. Ниже приведено объявление типа элемента с именем TITLE, для содержимого которого могут использоваться только символьные данные (дочерние элементы не допускаются):
<!ELEMENT TITLE (#PCDATA)>
А вот объявление для типа элемента с именем GENERAL, содержимое которого может быть любым:
<!ELEMENT GENERAL ANY>
В качестве последнего примера рассмотрим законченный XML-документ с двумя типами элементов. Объявление типа элемента COLLECTION указывает, что он может содержать один или несколько элементов CD, a объявление типа элемента CD указывает, что он может содержать только символьные данные. Заметим, что документ соответствует этим объявлениям, и, следовательно, является валидным:
<?xml version="1.0"?> <!DOCTYPE COLLECTION [ <!ELEMENT COLLECTION (CD)+> <!ELEMENT CD (#PCDATA)> <!-- Вы также можете включать комментарии в DTD. --> ] > <COLLECTION> <CD>Концерты для скрипки Моцарта</CD> <CD>Балет ”Лебединое озеро” Чайковского</CD> <CD>”Лунная соната” Бетховена</CD> </COLLECTION>
Определенный тип элемента в данном документе можно объявить только один раз.
Описание содержимого элемента
Описать содержимое элемента - т.е. заполнить часть “описъ_содержимого” в объявлении типа элемента – можно четырьмя различными способами. · Пустое содержимое (EMPTY). Ключевое слово EMPTY указывает, что элемент должен быть пустым, т.е. не может иметь содержимого. Например:
<!ELEMENT IMAGE EMPTY>
Ниже приведены валидные элементы IMAGE, которые можно поместить в документ:
<IMAGE></IMAGE> <IMAGE />
· Любое содержимое (ANY). Ключевое слово ANY указывает, что элемент может иметь любое допустимое для этого типа содержимое. Элемент этого типа может содержать или не содержать дочерние элементы в любом порядке и с любым количеством вхождений, иметь или не иметь чередующиеся символьные данные. Это наиболее неопределенный тип описания содержимого, он дает возможность создавать типы элементов без ограничений на их содержимое. Вот пример соответствующего объявления:
<!ELEMENT MISC ANY>
· Содержимое элемента (также называемое дочернее содержимое). При таком описании типа содержимого элемент может содержать дочерние элементы, но не может непосредственно содержать символьные данные. · Смешанное содержимое. При этом описании типа содержимого элемент может содержать любое количество смешанных данных, в том числе и чередующихся с дочерними элементами определенных типов.
Задание содержимого элемента
Если элемент имеет содержимое, он может непосредственно содержать только определенные дочерние элементы, но не символьные данные. В тексте документа можно разделять дочерние элементы пробелами, чтобы улучшить восприятие документа, но процессор будет игнорировать символы пробела и не передаст их приложению. Рассмотрим следующий пример 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>
Задание смешанного содержимого
Если элемент имеет смешанное содержимое, он может включать символьные данные. Если же задать в объявлении один или несколько типов дочерних элементов, он может содержать любые из этих дочерних элементов в любом порядке и с любым количеством вхождений (нуль и более). Другими словами, при смешанном содержимом можно задавать типы дочерних элементов, но нельзя задавать порядок или количество вхождений дочерних элементов, а также задавать обязательность включения для определенных типов дочерних элементов. Чтобы объявить тип элемента смешанного содержимого, можно воспользоваться одной из следующих форм модели содержимого. · Только символьные данные. Чтобы объявить тип элемента, который может содержать только символьные данные, используйте модель содержимого (#PCDATA). Так, следующее объявление указывает, что для элемента SUBTITLE допускаются только символьные данные:
<!ELEMENT SUBTITLE (#PCDATA)>
Следующие два элемента в соответствии с данной декларацией являются корректными:
<SUBTITLE>Новый подход</SUBTITLE> <SUBTITLE></SUBTITLE>
Заметим, что элемент, который в соответствии с объявлением должен содержать символьные данные, может и не иметь никаких символов, т.е. быть пустым. Ключевое слово PCDATA относится к синтаксически анализируемым (разбираемым) символьным данным. Как известно, XML-процессор синтаксически разбирает символьные данные внутри элемента, т.е. сканирует элемент в поиске XML-разметки. В связи с этим нельзя использовать правую угловую скобку (<) или знак амперсанда (&) или символы ]]> как часть символьных данных, поскольку синтаксический анализатор будет интерпретировать каждый из этих символов или группы символов как разметку. Однако можно использовать любые символы с помощью ссылки на символ или на предопределенный примитив (см. далее) или с помощью раздела CDATA. · Символьные данные с необязательными дочерними элементами. Чтобы объявить тип элемента, который может содержать символьные данные плюс ни одного или несколько дочерних элементов, перечислите каждый тип дочернего элемента после ключевого слова PCDATA в модели содержимого, разделяя их символами “|” и помещая звездочку (*) в конце всей модели содержимого. Каждое имя элемента может появляться в модели содержимого только один раз. Например, следующее объявление указывает, что элемент TITLE может содержать символьные данные плюс ни одного или несколько дочерних элементов SUBTITLE:
<!ELEMENT TITLE (#PCDATA | SUBTITLE)*>
В соответствии с этим объявлением следующие элементы TITLE являются допустимыми: <TITLE> Языки разметки документов <SUBTITLE>Язык XML</SUBTITLE> </TITLE> <TITLE> <SUBTITLE>Язык XML</SUBTITLE> Языки разметки документов </TITLE> <TITLE> Языки разметки документов </TITLE> <TITLE> <SUBTITLE>Язык XML</SUBTITLE> <SUBTITLE> Язык MathML </SUBTITLE> </TITLE> <ТITLE></TITLE>
Лабораторная работа №4
1. В картотеке студентов, созданной в лабораторной работе №1, для каждого студента дополнительно укажите его физические данные (пол, рост и вес). 2. В созданный XML-документ вставьте объявление типа документа DTD. Для указания фамилии, имени и отчества используйте последовательную форму модели дочерних элементов. Для указания даты рождения и места проживания, а также для указания физических данных используйте выборочную форму модели дочерних элементов. 3. Для отображения документа в браузере создайте новую таблицу какскадных стилей, предварительно согласовав её с преподавателем. 4. Сохраните созданный документ в папке под своей фамилией. 5. Закройте текстовый редактор “Блокнот”. 6. Откройте для просмотра созданный XML-документ в браузере Internet Explorer. 7. При появлении сообщений об ошибках, постарайтесь их найти и устранить. 8. Сдайте работу преподавателю.
![]() |