Привет, Гость!
Учебник PHP #14
вложенных тега: title, description, ingredients и process. Поскольку после имен тегов не указываются признаки повторения (см. следующий раздел), внутри тегов recipe должна быть заключена ровно одна пара каждого из перечисленных тегов.
<! ELEMENT title (#PCDATA)>
Перед нами первое определение тега, который не содержит вложенных тегов. В соответствии с определением он содержит #PCDATA, то есть произвольные символьные данные, не считающиеся частью разметки.
<!ELEMENT ingredients (ingredient+)>
В соответствии с определением элемент ingredients содержит один или несколько тегов с именем ingredient. Обратитесь к листингу 14.1, и вы все поймете.
<! ELEMENT ingredient (#PCDATA)>
Поскольку элемент ingredient соответствует отдельному ингредиенту, вполне логично, что этот элемент содержит простые символьные данные.
<! ELEMENT process (step+)>
Элемент process содержит один или несколько экземпляров элемента step.
<! ELEMENT step (#PCDATA)>
Элемент step, как и элемент ingredient, соответствует отдельному пункту в списке более высокого уровня. Следовательно, он должен содержать символьные данные.
<!ATTLIST recipe category CDATA #REQUIRED>
Обратите внимание: элемент recipe в листинге 14.1 содержит атрибут. Этот атрибут, category, определяет общую категорию, к которой относится рецепт — в приведенном примере это категория «итальянская кухня» (Italian). В определении ATTLIST указывается как имя элемента, так и имя атрибута. Кроме того, отнесение каждого рецепта к определенной категории упрощает классификацию, поэтому атрибут объявляется обязательным (#REQUIRED).
]>
Последняя строка просто завершает определение DTD. Определение всегда должно быть должным образом завершено, иначе произойдет ошибка.
В завершение этого раздела я приведу сводку основных компонентов типичного DTD-файла:
объявления типов элементов;
объявления атрибутов;
ID, IDREF и IDREFS;
объявления сущностей.
Некоторые из этих компонентов уже встречались нам в описании листинга 14.2. Далее каждый компонент будет описан более подробно.
Объявления элементов
Все элементы, используемые в документе XML, должны быть определены в DTD, прилагаемом к документу. Мы уже встречались с двумя распространенными разновидностями определений: для элемента, содержащего другие элементы, и элемента, содержащего символьные данные. Данное определение свидетельствует, что элемент содержит только символьные данные:
<! ELEMENT описание (#РСDАТА)>
Следующее определение элемента process говорит о том, что он содержит ровно один вложенный элемент с именем step:
<!ELEMENT process (step)>
Впрочем, процессы (process) из одного шага (step) встречаются довольно редко — скорее всего, шагов будет несколько. Чтобы указать, что элемент содержит один или несколько экземпляров вложенного элемента step, следует воспользоваться признаком повторения:
<!ELEMENT process (step+)>
Количество вложенных элементов можно задать несколькими способами. Полный список операторов элементов приведен в табл. 14.1.
Таблица 14.1. Операторы элементов
Признак Значение
? Ноль или ровно один экземпляр
* Ноль или несколько экземпляров
+ Один или несколько экземпляров
Ровно один экземпляр
| Один из элементов
, Перечисление элементов
Если элемент будет содержать несколько вложенных элементов, их следует перечислить через запятую в определении родительского элемента:
<!ELEMENT recipe (title, description, ingredients, process)>
Поскольку признаки повторения не указаны, каждый тег должен встречаться ровно один раз.
Определение элемента уточняется при помощи логических операторов. Предположим, вы работаете с рецептами, в которые всегда входят макароны (pasta) с одним или несколькими типами сыра (cheese) или мяса (meat). В этом случае элемент ingredient определяется следующим образом:
<!ELEMENT ingredient (pasta+, (cheese | meat)+)>
Поскольку элемент pasta обязательно должен присутствовать в элементе ingredient, он указывается с признаком повторения +. Затем следует либо элемент cheese, либо элемент meat; мы разделяем альтернативы вертикальной чертой и заключаем их в круглые скобки со знаком +, поскольку в рецепт всегда входит либо одно, либо другое.
Существуют и другие разновидности определений элементов. Мы рассмотрели лишь простейшие случаи. Тем не менее, приведенного материала вполне достаточно для понимания примеров, приведенных в оставшейся части этой главы.
Объявления атрибутов
Атрибуты элементов описывают значения, связываемые с элементами. Элементы XML, как и элементы HTML, могут иметь ноль, один или несколько атрибутов. Общий синтаксис объявления атрибутов выглядит следующим образом:
<!ATTLIST имя_элемента имя_атри6ута1 тип_данных1 флаг1
Имя_элемента определяет имя элемента, включаемое в тег. Затем перечисляются атрибуты, связанные с данным элементом. Объявление каждого атрибута состоит из трех основных компонентов: имени, типа данных и флага, определяющего особенности данного атрибута. Вместо многоточия (...) могут быть расположены объявления других атрибутов.
Простое объявление атрибута уже встречалось нам в листинге 14.2:
<!ATTLIST recipe category CDATA #REQUIRED>
Тем не менее, как видно из приведенного общего определения, допускается одновременное объявление нескольких атрибутов. Допустим, в дополнение к атрибуту category вы хотите связать с элементом recipe дополнительный атрибут difficulty (сложность приготовления). Оба атрибута объявляются в одном списке:
<!ATTLIST recipe category CDATA #REQUIRED difficulty CDATA #REQUIRED>
Форматировать объявления подобным образом необязательно; тем не менее, многострочные объявления нагляднее однострочных. Кроме того, поскольку оба атрибута являются обязательными, тег reci ре не может ограничиться каким-нибудь одним атрибутом, он должен включать в себя оба атрибута сразу. Например, следующий тег будет считаться неверным: <recipe difficulty="hard">
Почему? Потому что в нем отсутствует атрибут category. Правильный тег должен содержать оба атрибута:
<recipe category="Italian" difficulty="hard">
Особые условия обработки атрибута описываются тремя флагами, перечисленными в табл. 14.2.
Таблица 14.2. Флаги атрибутов
Флаг
Описание
#FIXED
Во всех экземплярах элемента в документе атрибуту может присваиваться только одно конкретное значение
#IMPLIED
Если атрибут не указан в элементе, используется значение по умолчанию
#REQUIRED
Атрибут является обязательным и должен присутствовать во всех экземплярах элемента в документе
Типы атрибутов
Атрибут элемента может объявляться с определенным типом. Типы атрибутов описаны далее.
Атрибуты CDATA
Очень часто атрибуты содержат общие символьные данные. Такие атрибуты называются атрибутами CDATA. Следующий пример уже встречался в начале этого раздела:
<!ATTLIST recipe category COATA #REQUIRED>
Атрибуты ID, IDREF и IDREFS
Идея однозначного представления данных (например, информации о пользователе
<! ELEMENT title (#PCDATA)>
Перед нами первое определение тега, который не содержит вложенных тегов. В соответствии с определением он содержит #PCDATA, то есть произвольные символьные данные, не считающиеся частью разметки.
<!ELEMENT ingredients (ingredient+)>
В соответствии с определением элемент ingredients содержит один или несколько тегов с именем ingredient. Обратитесь к листингу 14.1, и вы все поймете.
<! ELEMENT ingredient (#PCDATA)>
Поскольку элемент ingredient соответствует отдельному ингредиенту, вполне логично, что этот элемент содержит простые символьные данные.
<! ELEMENT process (step+)>
Элемент process содержит один или несколько экземпляров элемента step.
<! ELEMENT step (#PCDATA)>
Элемент step, как и элемент ingredient, соответствует отдельному пункту в списке более высокого уровня. Следовательно, он должен содержать символьные данные.
<!ATTLIST recipe category CDATA #REQUIRED>
Обратите внимание: элемент recipe в листинге 14.1 содержит атрибут. Этот атрибут, category, определяет общую категорию, к которой относится рецепт — в приведенном примере это категория «итальянская кухня» (Italian). В определении ATTLIST указывается как имя элемента, так и имя атрибута. Кроме того, отнесение каждого рецепта к определенной категории упрощает классификацию, поэтому атрибут объявляется обязательным (#REQUIRED).
]>
Последняя строка просто завершает определение DTD. Определение всегда должно быть должным образом завершено, иначе произойдет ошибка.
В завершение этого раздела я приведу сводку основных компонентов типичного DTD-файла:
объявления типов элементов;
объявления атрибутов;
ID, IDREF и IDREFS;
объявления сущностей.
Некоторые из этих компонентов уже встречались нам в описании листинга 14.2. Далее каждый компонент будет описан более подробно.
Объявления элементов
Все элементы, используемые в документе XML, должны быть определены в DTD, прилагаемом к документу. Мы уже встречались с двумя распространенными разновидностями определений: для элемента, содержащего другие элементы, и элемента, содержащего символьные данные. Данное определение свидетельствует, что элемент содержит только символьные данные:
<! ELEMENT описание (#РСDАТА)>
Следующее определение элемента process говорит о том, что он содержит ровно один вложенный элемент с именем step:
<!ELEMENT process (step)>
Впрочем, процессы (process) из одного шага (step) встречаются довольно редко — скорее всего, шагов будет несколько. Чтобы указать, что элемент содержит один или несколько экземпляров вложенного элемента step, следует воспользоваться признаком повторения:
<!ELEMENT process (step+)>
Количество вложенных элементов можно задать несколькими способами. Полный список операторов элементов приведен в табл. 14.1.
Таблица 14.1. Операторы элементов
Признак Значение
? Ноль или ровно один экземпляр
* Ноль или несколько экземпляров
+ Один или несколько экземпляров
Ровно один экземпляр
| Один из элементов
, Перечисление элементов
Если элемент будет содержать несколько вложенных элементов, их следует перечислить через запятую в определении родительского элемента:
<!ELEMENT recipe (title, description, ingredients, process)>
Поскольку признаки повторения не указаны, каждый тег должен встречаться ровно один раз.
Определение элемента уточняется при помощи логических операторов. Предположим, вы работаете с рецептами, в которые всегда входят макароны (pasta) с одним или несколькими типами сыра (cheese) или мяса (meat). В этом случае элемент ingredient определяется следующим образом:
<!ELEMENT ingredient (pasta+, (cheese | meat)+)>
Поскольку элемент pasta обязательно должен присутствовать в элементе ingredient, он указывается с признаком повторения +. Затем следует либо элемент cheese, либо элемент meat; мы разделяем альтернативы вертикальной чертой и заключаем их в круглые скобки со знаком +, поскольку в рецепт всегда входит либо одно, либо другое.
Существуют и другие разновидности определений элементов. Мы рассмотрели лишь простейшие случаи. Тем не менее, приведенного материала вполне достаточно для понимания примеров, приведенных в оставшейся части этой главы.
Объявления атрибутов
Атрибуты элементов описывают значения, связываемые с элементами. Элементы XML, как и элементы HTML, могут иметь ноль, один или несколько атрибутов. Общий синтаксис объявления атрибутов выглядит следующим образом:
<!ATTLIST имя_элемента имя_атри6ута1 тип_данных1 флаг1
Имя_элемента определяет имя элемента, включаемое в тег. Затем перечисляются атрибуты, связанные с данным элементом. Объявление каждого атрибута состоит из трех основных компонентов: имени, типа данных и флага, определяющего особенности данного атрибута. Вместо многоточия (...) могут быть расположены объявления других атрибутов.
Простое объявление атрибута уже встречалось нам в листинге 14.2:
<!ATTLIST recipe category CDATA #REQUIRED>
Тем не менее, как видно из приведенного общего определения, допускается одновременное объявление нескольких атрибутов. Допустим, в дополнение к атрибуту category вы хотите связать с элементом recipe дополнительный атрибут difficulty (сложность приготовления). Оба атрибута объявляются в одном списке:
<!ATTLIST recipe category CDATA #REQUIRED difficulty CDATA #REQUIRED>
Форматировать объявления подобным образом необязательно; тем не менее, многострочные объявления нагляднее однострочных. Кроме того, поскольку оба атрибута являются обязательными, тег reci ре не может ограничиться каким-нибудь одним атрибутом, он должен включать в себя оба атрибута сразу. Например, следующий тег будет считаться неверным: <recipe difficulty="hard">
Почему? Потому что в нем отсутствует атрибут category. Правильный тег должен содержать оба атрибута:
<recipe category="Italian" difficulty="hard">
Особые условия обработки атрибута описываются тремя флагами, перечисленными в табл. 14.2.
Таблица 14.2. Флаги атрибутов
Флаг
Описание
#FIXED
Во всех экземплярах элемента в документе атрибуту может присваиваться только одно конкретное значение
#IMPLIED
Если атрибут не указан в элементе, используется значение по умолчанию
#REQUIRED
Атрибут является обязательным и должен присутствовать во всех экземплярах элемента в документе
Типы атрибутов
Атрибут элемента может объявляться с определенным типом. Типы атрибутов описаны далее.
Атрибуты CDATA
Очень часто атрибуты содержат общие символьные данные. Такие атрибуты называются атрибутами CDATA. Следующий пример уже встречался в начале этого раздела:
<!ATTLIST recipe category COATA #REQUIRED>
Атрибуты ID, IDREF и IDREFS
Идея однозначного представления данных (например, информации о пользователе
Комментарии (0)
Скачать Java книгу»php/mysql/pdo/js
В библиотеку