Опубликован: 24.01.2007 | Уровень: для всех | Доступ: платный
Лекция 5:

Создание валидных XML-документов

Задание смешанного содержимого

Если элемент имеет смешанное содержимое, он может включать символьные данные. Если же вы зададите в объявлении один или несколько типов дочерних элементов, он может содержать любые из этих дочерних элементов в любом порядке и с любым количеством вхождений (нуль и более). Другими словами, при смешанном содержимом вы можете задавать типы дочерних элементов, но не можете задавать порядок или количество вхождений дочерних элементов, а также задавать обязательность включения для определенных типов дочерних элементов.

Чтобы объявить тип элемента смешанного содержимого, вы можете воспользоваться одной из следующих форм модели содержимого.

  • Только символьные данные. Чтобы объявить тип элемента, который может содержать только символьные данные, используйте модель содержимого ( #PCDATA ). Так, следующее объявление указывает, что для элемента SUBTITLE допускаются только символьные данные:
    <!ELEMENT SUBTITLE (#PCDATA)>

    Следующие два элемента в соответствии с данной декларацией являются корректными:

    <SUBTITLE>A New Approach</SUBTITLE>
    <SUBTITLE></SUBTITLE>

    Заметим, что элемент, который в соответствии с объявлением должен содержать символьные данные, может и не иметь никаких символов – т.е. быть пустым.

    Примечание. Ключевое слово PCDATA относится к синтаксически анализируемым (разбираемым) символьным данным. Из "Создание корректно сформированных XML-документов" вам известно, что XML-процессор синтаксически разбирает символьные данные внутри элемента – т.е. сканирует элемент в поиске XML-разметки. В связи с этим вы не можете использовать левую угловую скобку (<) или знак амперсанда (&) или символы ]]> как часть символьных данных, поскольку синтаксический анализатор будет интерпретировать каждый из этих символов или группы символов как разметку. Однако вы можете использовать любые символы с помощью ссылки на символ или на предопределенный примитив (см. "Определение и использование примитивов" ), либо с помощью раздела CDATA (см. "Добавление комментариев, инструкций по обработке и разделов CDATA" ).

  • Символьные данные с необязательными дочерними элементами. Чтобы объявить тип элемента, который может содержать символьные данные плюс ни одного или несколько дочерних элементов, перечислите каждый тип дочернего элемента после ключевого слова 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>

Объявление атрибутов

В валидном XML-документе вы также должны исчерпывающе объявить все атрибуты, которые вы предполагаете использовать для элементов документа. Вы определяете все атрибуты, ассоциированные с определенным элементом, с помощью специального типа DTD-разметки, называемого объявлением списка атрибутов. Это объявление:

  • определяет имена атрибутов, ассоциированных с элементом. В валидном документе вы можете включить в начальный тег элемента только те атрибуты, которые определены для элемента;
  • устанавливает тип данных каждого атрибута;
  • задает обязательность для каждого атрибута. Если атрибут необязателен, в объявлении списка атрибутов указывается, что должен делать процессор, если атрибут опущен. (В объявлении должно, например, содержаться значение атрибута по умолчанию, которое будет использовать процессор.)

Форма записи объявления списка атрибутов

Объявление списка атрибутов имеет следующую общую форму:

<!ATTLIST Имя ОпрАтр>

Здесь Имя представляет собой имя элемента, ассоциированного с атрибутом или атрибутами. ОпрАтр – это одно или несколько определений атрибутов, каждое из которых определяет один атрибут.

Определение атрибута имеет следующую форму записи:

Имя ТипАтр ОбъявУмолч

Здесь Имя представляет собой имя атрибута. (Правила выбора имен атрибутов приведены в разделе "Правила создания атрибутов" в "Создание корректно сформированных XML-документов" .)

ТипАтр представляет собой тип атрибута, т.е. виды значений, которые могут быть присвоены атрибуту. (О типах атрибутов пойдет речь в следующем разделе.) ОбъявУмолч – это объявление по умолчанию, которое указывает на обязательность атрибута и содержит другую информацию. (Об этом будет рассказано далее в этой лекции.)

Допустим, вы объявили тип элемента с именем FILM следующим образом:

<!ELEMENT FILM (TITLE, (STAR  |  NARRATOR  |  INSTRUCTOR) )>

Вот пример объявления списка атрибутов, которое описывает два атрибута – Class и Year – для элемента FILM:

<!ATTLIST FILM  Class CDATA "fictional"  Year CDATA #REQUIRED>

На рисунке 5.3 представлены составные части этого объявления.


Рис. 5.3.

Вы можете присвоить атрибуту Class любую строку в кавычках (ключевое слово CDATA ); если вы опускаете атрибут для определенного элемента, ему будет автоматически присвоено значение по умолчанию "fictional". Вы можете присвоить атрибуту Year любую строку в кавычках; этот атрибут, однако, должен быть обязательно присвоен для каждого элемента FILM (ключевое слово #REQUIRED ), поэтому он не имеет значения по умолчанию.

Следующий полный XML-документ включает это объявление списка атрибутов, а также элемент FILM:

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE FILM
	[
	<!ELEMENT FILM (TITLE, (STAR  |  NARRATOR  |  INSTRUCTOR) )>
	<!ATTLIST FILM   Class CDATA "fictional"   Year CDATA 
	#REQUIRED>
	<!ELEMENT TITLE (#PCDATA)>
	<!ELEMENT STAR (#PCDATA)>
	<!ELEMENT NARRATOR (#PCDATA)>
	<!ELEMENT INSTRUCTOR (#PCDATA)>
	]
>
<FILM Year="1948">
	<TITLE>The Morning After</TITLE>
	<STAR>Morgan Attenbury</STAR>
</FILM>

Для элемента FILM атрибуту Year присвоено значение "1948". Атрибут Class опущен; однако, поскольку этот атрибут имеет значение по умолчанию ("fictional"), оно присваивается атрибуту, как если бы вы записали его в качестве значения атрибута.

Примечание. Если вы использовали для данного типа элемента более одного объявления списка атрибутов, содержания двух объявлений объединяются. Если атрибут с заданным именем объявлен для одного и того же элемента несколько раз, первое объявление используется, а последующие – игнорируются. (Множественные объявления списков атрибутов могут иметь место, если документ имеет как внутренние, так и внешние DTD, о чем пойдет речь далее в этой лекции.)

Максим Попов
Максим Попов

Почему при использовании скриптов, приведенных в курсе Основы XML

лекция Лекция 8: 

Отображение XML-документов с использованием связывания данных

не происходит связывания XLM документа с HTML?

Отображаются пустые поля. Браузер IE11

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Максим Самсоненко
Максим Самсоненко
Россия
Алексей Шибаев
Алексей Шибаев
Россия, г. Новошахтинск