элемент, а также порядок их следования.
Первые два случая определения элемента довольно просты. Их использование может быть продемонстрировано на следующем примере:
Декларация
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
определяет документ с корневым элементом advert, в котором могут встречаться также элементы product и classified, причем элементы advert и product могут содержать любые данные и любые из объявленных элементов, а элемент classified всегда должен быть пустым.
Приведем пример документа, построенного в соответствии с этой декларацией.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
<advert>
<product>
Покупайте наших слонов!
</product>
<classified/>
</advert>
В третьем случае содержимое элемента определяется при помощи формальных правил, которые очень похожи на те, которые используются в расширенных формах Бэкуса-Наура. Подобно тому, как в EBNF формальные правила используются для того, чтобы стандартизировать последовательность символов, составляющую конструкции некоторого языка, в определениях элементов они используются для описания содержимого элемента — последовательности из символьных данных и дочерних элементов.
Количество, с которым элемент может появляться в этой последовательности, формально записывается с использованием символов-модификаторов '*', '?', ' +', которые имеют следующие значения:
□ а? — означает, что элемент а может быть пропущен в последовательности;
□ а — означает, что элемент а должен присутствовать в последовательности на этом месте ровно один раз;
□ а* — задает последовательность из нуля или более элементов а;
□ a+ — задает последовательность из одного или более элементов а.
Кроме того, содержимое может моделироваться как перечисление и выбор элементов.
Элементы перечисляются через запятую в круглых скобках, например (a, b, c) — это последовательность, состоящая из элементов a, b, c. Такая запись означает, что первым должен идти элемент a, затем сразу же за ним элемент b и элемент c.
Выбор элемента задается аналогично перечислению, только разделительным символом является не запятая, а знак '|'. Например, (a | b | c) задает выбор одного из трех элементов a, b или c.
При записи выбора и перечисления элементы могут также указываться с использованием модификаторов количества.
(a* | b? | с | d+)
определяет содержимое, как последовательность, состоящую из нуля или более элементов a b, который может быть пропущен, с, d.
Помимо этого, формальные правила могут использовать при записи другие формальные правила.
((a | b), (с | d))
задает содержимое, первым элементом которого является a или b, вторым — элемент с или d.
Содержимое элементов может также включать символьные данные, которые обозначаются при помощи ключевого слова #PCDATA (parsable character data — разбираемые символьные данные).
<!ELEMENT product (#PCDATA)>
означает, что элемент product должен содержать только символьные данные.
Помимо текста элементы могут также включать в себя другие элементы. Содержимое такого типа называется (#PCDATA | ... | ... ) *.
При помощи формальных правил можно точно и гибко задавать логическую структуру элементов документа. В качестве примера приведем определения элементов для нашего документа с рекламным объявлением.
Предположим, мы хотим определить документ со следующей логической структурой:
□ корневым элементом документа является элемент advert;
□ элемент advert содержит последовательность, состоящую из нескольких элементов product и одного элемента classified, который может быть пропущен;
□ элемент product может содержать текст и другие элементы product в любом порядке;
□ элемент classified не имеет содержимого.
Документ соответствующей логической структуры может быть задан следующим образом.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE advert [
<!ELEMENT advert (product+, classified*)>
<!ELEMENT product (#PCDATA | product)*>
<!ELEMENT classified EMPTY>
]>
<advert>
<product>
Покупайте наших слонов!
</product>
<classified/>
