Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
k5.doc
Скачиваний:
4
Добавлен:
13.11.2019
Размер:
287.23 Кб
Скачать

Символ Значение

?

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

+

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

*

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

Например, следующее объявление означает, что вы можете включить один или более дочерних элементов 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>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]