Пример
означает, что элемент productдолжен содержать только символьные данные.
Помимо текста элементы могут также включать в себя другие элементы. Содержимое такого типа называется смешанным . Формальные правила смешанного содержимого должны всегда иметь вид (#PCDATA | ... | ... ) *.
При помощи формальных правил можно точно и гибко задавать логическую структуру элементов документа. В качестве примера приведем определения элементов для нашего документа с рекламным объявлением.
Пример
Предположим, мы хотим определить документ со следующей логической структурой:
□ корневым элементом документа является элемент advert;
□ элемент advertсодержит последовательность, состоящую из нескольких элементов product и одного элемента classified, который может быть пропущен;
□ элемент productможет содержать текст и другие элементы productв любом порядке;
□ элемент classifiedне имеет содержимого.
Документ соответствующей логической структуры может быть задан следующим образом.
Листинг 1.4
Покупайте наших слонов!
Определению элемента соответствует EBNF-продукция elementdecl:
[45] elementdecl ::= ''
Нетерминал contentspec, следующий через пробельное пространство за именем элемента, определяет тип содержимого, которое может иметь этот элемент:
[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children
Строка " EMPTY" соответствует пустому элементу, " ANY" — любому содержимому, нетерминал Mixed— смешанному содержимому, children— содержимому, которое определяется формальными правилами.
[47] children ::= (choice | seq) ('?' | '*' | '+')?
[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
[49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')'
[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')'
Определение списка атрибутов
Список атрибутов некоторого элемента задается следующим образом:
элемент
атрибут1 тип1 значение1
атрибут2 тип2 значение2
и т. д ...>
В этом определении элемент задает имя элемента, для которого определяется данный список атрибутов, атрибут — имя атрибута, тип — тип атрибута и значение — значение атрибута.
Имя атрибута отвечает в XML тем же самым требованиям, что и имя элемента — оно должно начинаться с буквы и может содержать другие буквы, цифры и некоторые знаки препинания.
Тип атрибута может быть одним из следующих:
□ CDATA— символьные данные;
□ ID— уникальный идентификатор;
□ IDREF— ссылка на уникальный идентификатор;
□ IDREFS— набор ссылок;
□ ENTITY— сущность;
□ ENTITIES— набор сущностей;
□ NMTOKEN— именной токен;
□ NMTOKENS— набор именных токенов;
□ NOTATION— нотация;
□ перечисление возможных значений атрибута.
Следует поподробнее остановиться на типе ID, поскольку атрибуты этого типа играют важную роль в повышении эффективности обработки XML-документов. Атрибуты типа IDмогут содержать значения, которые однозначным образом идентифицируют элемент в документе. То есть, если тип атрибута объявлен как ID, его значение должно быть уникальным внутри документа. Это позволяет создавать для элементов с ID-атрибутами индексы по значению атрибута, для более быстрого доступа. Например, в языке XPath, имеется функция id, которая по данному строковому параметру возвращает множество, состоящее из элемента, ID-атрибут которого совпадает с этим параметром. Естественно, тип IDне гарантирует, что доступ к элементам в любом случае будет производиться быстрее — это зависит от реализации обрабатывающих программ. Однако большинство современных XML-процессоров при работе с ID-атрибутами используют механизмы оптимизации.
Тип IDможет быть полезен и при создании кросс-ссылок между элементами в самих XML-документах, для описания информации, структура которой выходит за рамки обычных деревьев. Уникальные значения, заданные в атрибуте IDмогут использоваться в атрибутах типов IDREF(ссылка на идентифицирующее значение) и IDREFS(набор таких ссылок).
Значение определяет, как и какие значения должны быть присвоены атрибуту. Значением может быть:
□ ключевое слово #REQUIRED, которое показывает, что этот атрибут должен всегда присутствовать в элементе и иметь некоторое значение;
Читать дальше