Опубликован: 24.01.2007 | Доступ: свободный | Студентов: 9680 / 1717 | Оценка: 4.28 / 4.09 | Длительность: 20:51:00
Лекция 5:

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

Использование внешних подмножеств DTD

Описания типа документа, рассмотренные нами в этой лекции, полностью содержатся внутри объявления типа документа в составе документа. Такой тип DTD называется внутренним подмножеством DTD.

Вы также можете поместить все или часть DTD документа в отдельный файл, а затем ссылаться на этот файл из объявления типа документа. DTD – или часть DTD – содержащаяся в отдельном файле, называется внешним подмножеством DTD.

Примечание. Применение внешнего подмножества DTD имеет смысл главным образом для DTD, которые являются общими для целой группы документов. Каждый документ может ссылаться на один файл DTD (или копию этого файла) как на внешнее подмножество DTD. При этом вам не надо копировать содержимое DTD в каждый использующий его документ, а также облегчается внесение изменений в DTD. (Вам требуется модифицировать только файл DTD – и все копии этого файла – вместо того, чтобы редактировать все документы, которые его используют.) Как вам известно из "Знакомство с XML" , многие стандартные XML-приложения основаны на общем DTD, включаемом во все XML-документы, отвечающие этому приложению. (См. разделы "Стандартные XML-приложения" и "Реальное использование XML" в "Знакомство с XML" .)

Использование только внешнего подмножества DTD

Чтобы использовать только внешнее подмножество DTD, опустите блок объявлений разметки, ограниченных квадратными скобками ([]), и вместо этого включите ключевое слово SYSTEM, после которого в кавычках должно следовать описание местонахождения отдельного файла, содержащего DTD. Рассмотрим, например, документ SIMPLE, используемый ранее в этой лекции и имеющий внутреннее подмножество DTD:

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE SIMPLE
	[
	<!ELEMENT SIMPLE ANY>
	]
>
<SIMPLE> This is an extremely simplistic XML document. </SIMPLE>

Если в этом документе используется внешнее подмножество DTD, оно будет иметь следующий вид:

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE SIMPLE SYSTEM "Simple.dtd">
<SIMPLE> This is an extremely simplistic XML document. </SIMPLE>

Файл Simple.dtd должен иметь следующее содержимое:

<!ELEMENT SIMPLE ANY>

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

Описание местонахождения файла (в данном примере Simple.dtd ) называется системным литералом. Он может быть заключен в одинарные (') или двойные (") кавычки и содержать любые символы, за исключением символов кавычек, используемых как ограничители.

Системный литерал задает унифицированный идентификатор ресурса (URIuniform resource identifier) файла, содержащего внешнее подмножество DTD. В настоящее время URI практически аналогичен стандартному Internet-адресу, известному как унифицированный указатель ресурса (URLUniform Resource Locator). Вы можете использовать полностью прописанный URI, подобно следующему:

<!DOCTYPE SIMPLE SYSTEM "http://bogus.com/dtds/Simple.dtd">

Или, вы можете использовать частичный URI, который задает местонахождение относительно местонахождения XML-документа, содержащего URI, например:

<!DOCTYPE SIMPLE SYSTEM "Simple.dtd">

Примечание. URI представляет собой чрезвычайно гибкую систему нотации для адресации ресурсов. Одним из типов URI является URL (Uniform Resource Locator), обычно используемый в Internet (например, http://bogus.com/documents/Simple.dtd). Аналогично, если бы XML-документ был расположен в file:///C:\XML Step by Step\Example Code\Simple.xml, "Simple.dtd" ссылался бы на file:///C:\XML Step by Step\Example Code\Simple.dtd.

Использование и внешних, и внутренних подмножеств DTD

Чтобы использовать и внешнее и внутреннее подмножество DTD, следует использовать ключевое слово SYSTEM вместе с системным литералом, задающим местонахождение файла с внешним подмножеством DTD, после чего внутри квадратных скобок ([]) следует объявление разметки внутреннего подмножества DTD.

Вот пример простого XML-документа, имеющего как внутреннее, так и внешнее подмножество DTD:

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE BOOK SYSTEM "Book.dtd"
	[
	<!ATTLIST BOOK  ISBN CDATA #IMPLIED  Year CDATA "2000">
	<!ELEMENT TITLE (#PCDATA)>
	]
>
<BOOK Year="1998">
	<TITLE>The Scarlet Letter</TITLE>
</BOOK>

Вот содержимое файла Book.dtd, в котором хранится внешнее подмножество DTD:

<!ELEMENT BOOK ANY>
<!ATTLIST BOOK  ISBN NMTOKEN #REQUIRED>

Если вы используете внешнее и внутреннее подмножество DTD, XML-процессор объединяет их содержимое следующим образом:

  • в общем случае он осуществляет слияние двух подмножеств, чтобы сформировать полный DTD. В рассмотренном примере объединенный DTD определяет два элемента, TITLE и BOOK, а также два атрибута для элемента BOOK, ISBN и Year ;
  • однако в случае, если атрибут с одним и тем же именем и типом элемента объявляется более одного раза, XML-процессор использует первое объявление и игнорирует все последующие (Это правило применимо и для повторных объявлений примитивов, о чем будет рассказано в "Определение и использование примитивов" ).
  • внутреннее подмножество DTD имеет приоритет перед внешним подмножеством DTD (даже если ссылка на внешнее подмножество идет первой в объявлении типа документа). Таким образом, любой атрибут (или примитив), определенный во внутреннем подмножестве, доминирует над атрибутом с тем же именем и типом элемента, объявленным во внешнем подмножестве. В примере XML-процессор считает, что атрибут ISBN имеет тип CDATA и объявление значения по умолчанию #IMPLIED, поэтому следующий элемент (в котором не указан ISBN ) является корректным:
    <BOOK Year="1850">
    	<TITLE>The Scarlet Letter</TITLE>
    </BOOK>

Примечание. Хотя XML-процессор просто игнорирует повторные объявления атрибутов и примитивов, повторное объявление элемента (даже если он объявлен тем же самым образом) является допустимым.

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

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

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

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

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

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

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

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

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

Спасибо!