- •Основной критерий для валидного документа
- •Требования корректности формирования и валидности
- •Преимущества использования валидных xml-документов
- •Добавление dtd
- •Форма записи dtd
- •Создание dtd
- •Объявление типов элементов
- •Форма записи объявления типа элемента
- •Описание содержимого элемента
- •Задание содержимого элемента
- •Символ Значение
- •Задание смешанного содержимого
- •Объявление атрибутов
- •Форма записи объявления списка атрибутов
- •Тип атрибута
- •Задание маркерного типа
- •Задание нумерованных типов
- •Объявление значения по умолчанию
- •Использование внешних подмножеств dtd
- •Использование только внешнего подмножества dtd
- •Использование и внешних, и внутренних подмножеств dtd
- •Условия игнорирование разделов внешнего подмножества dtd
- •Преобразование корректно сформированного документа в валидный
- •Сделаем документ валидным
Символ Значение
?
Ни одного или один из предшествующих элементов
+
Один или более из предшествующих элементов
*
Ни одного или более из предшествующих элементов
Например, следующее объявление означает, что вы можете включить один или более дочерних элементов NAME, и что дочерний элемент HEIGHT является не обязательным:
<!ELEMENT MOUNTAIN (NAME+, HEIGHT?, STATE)>
Таким образом, следующий элемент будет правильным:
<MOUNTAIN>
<NAME>Pueblo Peak</NAME>
<NAME>Taos Mountain</NAME>
<STATE>New Mexico</STATE>
</MOUNTAIN>
Другой пример: следующее объявление означает, что вы можете включить несколько или ни одного дочернего элемента STAR, либо один дочерний элемент NARRATOR, либо один дочерний элемент INSTRUCTOR:
<!ELEMENT FILM (STAR* | NARRATOR | INSTRUCTOR)>
Соответственно, каждый из следующих трех элементов будет корректным:
<FILM>
<STAR>Tom Hanks</STAR>
<STAR>Meg Ryan</STAR>
</FILM>
<FILM>
<NARRATOR>Sir Gregory Parsloe</NARRATOR>
</FILM>
<FILM/>
Вы также можете воспользоваться символами ?, + или * для модификации всей модели содержимого, помещая символы непосредственно после закрывающих скобок. Например, следующее объявление дает вам возможность включить один или несколько дочерних элементов любого из этих трех типов в любом порядке:
<!ELEMENT FILM (STAR | NARRATOR | INSTRUCTOR)+>
Такое объявление делает корректными следующие элементы:
<FILM>
<NARRATOR>Bertram Wooster</NARRATOR>
<STAR>Sean Connery</STAR>
<NARRATOR>Plug Basham</NARRATOR>
</FILM>
<FILM>
<STAR>Sean Connery</STAR>
<STAR>Meg Ryan</STAR>
</FILM>
<FILM>
<INSTRUCTOR>Stinker Pike</INSTRUCTOR>
</FILM>
Наконец, вы можете формировать более сложные модели содержимого путем вложения выборочной модели содержимого внутрь последовательной модели, либо последовательной модели в выборочную модель. Например, следующее DTD задает, что каждый элемент FILM должен иметь один дочерний элемент TITLE; за ним должен следовать один дочерний элемент CLASS; после него должен идти один дочерний элемент STAR, NARRATOR или 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>The Net</TITLE>
<CLASS>fictional</CLASS>
<STAR>Sandra Bullok</STAR>
</FILM>
так же, как такой:
<FILM>
<TITLE>How to Use XML</TITLE>
<CLASS>instructional</CLASS>
<INSTRUCTOR>Penny Donaldson</INSTRUCTOR>
</FILM>
Задание смешанного содержимого
Если элемент имеет смешанное содержимое, он может включать символьные данные. Если же вы зададите в объявлении один или несколько типов дочерних элементов, он может содержать любые из этих дочерних элементов в любом порядке и с любым количеством вхождений (нуль и более). Другими словами, при смешанном содержимом вы можете задавать типы дочерних элементов, но не можете задавать порядок или количество вхождений дочерних элементов, а также задавать обязательность включения для определенных типов дочерних элементов.
Чтобы объявить тип элемента смешанного содержимого, вы можете воспользоваться одной из следующих форм модели содержимого.
Только символьные данные. Чтобы объявить тип элемента, который может содержать только символьные данные, используйте модель содержимого (#PCDATA). Так, следующее объявление указывает, что для элемента SUBTITLE допускаются только символьные данные:
<!ELEMENT SUBTITLE (#PCDATA)>
Следующие два элемента в соответствии с данной декларацией являются корректными:
<SUBTITLE>A New Approach</SUBTITLE>
<SUBTITLE></SUBTITLE>
Заметим, что элемент, который в соответствии с объявлением должен содержать символьные данные, может и не иметь никаких символов – т.е. быть пустым.
Примечание. Ключевое слово PCDATA относится к синтаксически анализируемым (разбираемым) символьным данным. Из лекции 3 вам известно, что XML-процессор синтаксически разбирает символьные данные внутри элемента – т.е. сканирует элемент в поиске XML-разметки. В связи с этим вы не можете использовать левую угловую скобку (<) или знак амперсанда (&) или символы ]]> как часть символьных данных, поскольку синтаксический анализатор будет интерпретировать каждый из этих символов или группы символов как разметку. Однако вы можете использовать любые символы с помощью ссылки на символ или на предопределенный примитив (см. лекцию 6), либо с помощью раздела CDATA (см. лекцию 4).
Символьные данные с необязательными дочерними элементами. Чтобы объявить тип элемента, который может содержать символьные данные плюс ни одного или несколько дочерних элементов, перечислите каждый тип дочернего элемента после ключевого слова PCDATA в модели содержимого, разделяя их символами ( и помещая звездочку (*) в конце всей модели содержимого. Каждое имя элемента может появляться в модели содержимого только один раз. Например, следующее объявление указывает, что элемент TITLE может содержать символьные данные плюс ни одного или несколько дочерних элементов SUBTITLE:
<!ELEMENT TITLE (#PCDATA | SUBTITLE)*>
В соответствии с этим объявлением следующие элементы TITLE являются допустимыми:
<TITLE>
Moby-Dick
<SUBTITLE>Or, the Whale</SUBTITLE>
</TITLE>
<TITLE>
<SUBTITLE>Or, the Whale</SUBTITLE>
Moby-Dick
</TITLE>
<TITLE>
Moby-Dick
</TITLE>
<TITLE>
<SUBTITLE>Or, the Whale</SUBTITLE>
<SUBTITLE>Another Subtitle</SUBTITLE>
</TITLE>
<TITLE></TITLE>