| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
ГЛАВА 6 Определение и использование примитивов
Механизм примитивов в XML является средством повышения производительности, а также способом встраивать различные типы данных в ваш XML-документ. В XML-документе вы можете определить часто используемый блок XML-текста как примитив, что позволяет быстро вставлять текст в нужное место. Вы можете также определить как примитив внешний файл, чтобы иметь возможность включать данные файла в ваш документ; эти данные могут содержать XML-текст, другой текст или не текстовые данные. Вы определяете примитив в описании типа документа (DTD) с использованием синтаксиса, аналогичного тому, который используется для объявления элемента или атрибута в валидном XML-документе. О DTD и объявлениях типа документа, содержащего их, говорилось в главе 5. В этой главе вы прежде всего познакомитесь с основной терминологией, используемой для примитивов, а также с различными способами классификации примитивов. Затем вы узнаете, как объявлять каждый из примитивов различных типов и как вставлять примитивы в ваш документ в необходимом месте. Далее вы узнаете, как использовать возможности XML, которые позволяют вам вставлять любые типы символов в любом контексте: как ссылки на символ и как ссылки на примитивы. В конце главы имеется упражнение, которое позволит вам попрактиковаться в использовании примитивов в полном XML-документе. Определения и классификация примитивов В спецификации XML термин примитив (entity) в широком смысле относится к любому из следующих типов единиц хранения информации для XML-документов.
Заметим, что первые три типа единиц хранения информации являются файлами, а последний - строкой символов, заключенных в кавычки. В этой главе термин примитив используется в узком смысле, а именно, для обозначения внешнего файла или строки в кавычках, определенных как примитив в DTD документа и допускающих использование в документе посредством ссылок на примитивы. Например, следующее DTD определяет внешний файл Topics.xml (этот файл содержит список тем в статье, включенной в документ) как внешний примитив с именем topics, a также строку в кавычках ("A Short History of XML") как внешний примитив с именем title:
Впоследствии вы можете вставить полный список тем в любое нужное вам место статьи (например, в аннотацию, введение или заключение), просто включив ссылку на примитив &topics;
Вы можете вставить название статьи в любое место, включив ссылку на примитив & title;
Механизм примитивов наиболее полезен при наличии часто используемых фрагментов XML-текста. Например, если название статьи многократно фигурирует по ее тексту, использование примитива (как в предыдущем примере) позволит сократить время набора, добиться однородности и облегчить внесение изменений в название. Вы можете изменить текст названия, встречающегося в различных листах статьи, просто отредактировав объявление примитива в DTD. Например:
Если вы знакомы с программированием, то легко уловите сходство между механизмом использования примитивов XML и определением констант в языках программирования (например, объявления с помощью инструкции #define в С). Механизм примитивов также необходим при включении не XML-данных в XML-документ (например, графические данные для изображения).
Типы примитивов Существует множество разновидностей примитивов. Материал, излагаемый в этом разделе, может показаться довольно абстрактным (прежде, чем вы познакомитесь с деталями и рассмотрите примеры), возвращение к этой информации впоследствии позволит значительно облегчить вос-] фиятие примитивов. Примитивы классифицируются по трем признакам:
Поскольку примитивы классифицируются по этим трем признакам и в каждой классификации имеются две категории, теоретически существует восемь потенциальных типов примитивов, как показано на диаграмме на следующей странице. Однако три типа примитивов из этих восьми в XML не поддерживаются (на диаграмме они зачеркнуты). Следовательно, реально в XML имеется только пять типов примитивов:
О том, как определять и использовать их, вы и узнаете в этой главе.
Объявление общих примитивов Примитив создается путем объявления его в DTD документа. Вы объявляете примитив с использованием разновидности объявления разметки, схожей с той, которая используется для объявления элементов и атрибутов. В последующих разделах вы узнаете, как объявлять каждый из типов общих примитивов.
Объявление общего внутреннего разбираемого примитива Объявление общего внутреннего разбираемого примитива имеет следующую форму записи: <! ENTITY ИмяПримитива ЗначениеПримитивa> Здесь ИмяПримитива есть имя примитива. Вы можете выбрать любое имя, следуя следующим правилам:
ЗначениеПримитива есть значение, которое вы присваиваете общему примитиву. Он представляет собой группу символов, заключенных в кавычки, которая также носит название литерал. Вы можете присвоить любое значение типа литерал общему внутреннему примитиву, соблюдая при этом следующие правила:
Например, следующее DTD определяет общий внутренний разбираемый примитив с именем title:
Примитив title содержит символьные данные плюс элемент (SUBTITLE). В соответствии с объявлением в DTD это содержимое может быть корректно вставлено только в элемент TITLEPAGE, как показано ниже:
XML-процессор заменит ссылку на примитив &title; содержимым примитива и обработает содержимое, как если бы вы непосредственно набрали его в документе в позиции ссылки, подобно следующему:
Объявление общего внешнего разбираемого примитива Объявление для общего внешнего разбираемого примитива имеет следующую форму записи: <! ENTITY ИмяПримитива SYSTEM СистемЛитерал> Здесь Имя Примитива есть имя примитива. Вы можете выбрать любое имя, следуя правилам задания имен для общих примитивов, приведенным в предыдущем разделе. Систем Литерал есть системный литерал, который описывает местонахождение файла, содержащего данные примитива. Системный литерал может Пить ограничен одинарными (') или двойными (") кавычками и содержать любые симшиил, кроме символа кавычек, используемого как ограничители. Системный литерал задает унифицированный идентификатор ресурса (URI) файла, содержащего данные примитива. На сегодняшний день URI -практически то же самое, что стандартный Internet-адрес, известный как унифицированный указатель ресурса (URL). Вы можете использовать либо полный URI, например:
либо частичный URI, который задает местонахождение относительно местонахождения XML-документа, содержащего URI, например:
Относительные URI в XML-документах работают аналогично относительным URL для HTML-страниц. Для более подробной информации об URI обратитесь к разделу «Использование только внешнего подмножества DTD» в главе 5. Файл внешнего примитива может содержать только те составляющие, которые могут быть корректно вставлены в элемент (символьные данные, вложенные элементы и т.д., как описано в разделе «Типы содержимого элемента» в главе 3). Вы можете вставить общий внешний разбираемый примитив только внутрь содержимого элемента. (Можно включить его в значение в объявлении внутреннего примитива, но затем нужно вставить это содержимое в элемент.) Например, следующее DTD определяет внешний файл Topics.xml как общий внешний разбираемый примитив:
Вот содержимое файла Topics.xml:
Этот типичный файл внешнего примитива содержит два пункта, которые вы можете включить в XML-элемент: вложенный элемент и блок символьных данных. Его содержимое может быть корректно вставлено в элемент INTRODUCTION (который иметь любой тип содержимого), как показано в следующем примере:
Объявление общего внешнего не разбираемого примитива Объявление для общего внешнего не разбираемого примитива имеет следующую форму записи:
Здесь ИмяПримитива есть имя примитива. Вы можете выбрать любое имя, следуя правилам, приведенным в разделе «Объявление общего внутреннего разбираемого примитива» ранее в этой главе. СистемЛитерал есть системный литерал, который описывает местонахождение файла, содержащего данные примитива. Он действует точно так же, как системный литерал для описания местоположения общего внешнего разбираемого примитива (см. предыдущий раздел). Примечание. Ключевое слово NDATA указывает, что файл примитива содержит не разбираемые данные (они не обрабатываются синтаксическим анализатором). Имя Нотации есть имя нотации, объявленной в DTD. Нотация описывает формат данных, содержащихся в файле примитива, или указывает на местонахождение программы, которая может обрабатывать эти данные. Файл не разбираемого внешнего примитива может содержать любой тип текста или не текстовые данные. Они должны, конечно, соответствовать описанию формата, определяемого соответствующей нотацией. Например, DTD в следующем XML-документе определяет файл Faun.gif (который содержит рисунок обложки книги) как общий внешний не разбираемый примитив с именем faun. Имя нотации этого примитива - GIF. ()на указывает на местонахождение программы, которая отображает графические файлы в формате GIF (ShowGif.exe). DTD также определяет пустой элемент с именем СОVERIMAGE и атрибут типа ENTI.TY для этого элемента с именем Source:
В элементе Документ атрибуту Source элемента COVERIMAGE присвоено имя внешнего примитива, который содержит графические данные для отображения рисунка обложки. Поскольку Source имеет тип ENTITY, вы можете присвоить ему имя общего внешнего не разбираемого примитива. Фактически единственный способ использования этого типа примитива состоит в присвоении его имени атрибуту с типом ENTITY или ENTITIES. Примечание. В отличие от файла внешнего разбираемого примитива, к файлу внешнего не разбираемого примитива XML-процессор прямого доступа не имеет. Процессор просто делает примитив и его нотацию доступными приложению, которое может выполнять необходимые действия с этой информацией. (Например, оно может запустить программу, ассоциированную с нотацией, и указать ей отобразить данные из файла примитива.) В главе 9 вы узнаете, как писать сценарии Web-страниц, которые могут получать доступ к примитивам и нотациям.
Объявление нотаций Нотация описывает определенный формат данных. Это делается путем указания адреса описания формата, адреса программы, которая может обрабатывать данные в этом формате, либо просто описание формата. Вы можете использовать нотацию, чтобы описать формат общего внешнего не разбираемого примитива (см. в предыдущем разделе), либо можете присвоить нотацию атрибуту, который имеет нумерованный тип NOTATION (см. раздел «Задание нумерованных типов» в главе 5). Нотация имеет следующую форму записи:
Здесь Имя Нотации есть имя нотации. Вы можете выбрать любое имя, при условии, что оно начинается с буквы или символа подчеркивания (_), после чего могут идти или не идти другие буквы, цифры, точки (.), тире (-) или символы подчеркивания. Лучше выбирать информативное имя, позволяющее идентифицировать формат. Например, если вы определяете нотацию, описывающую точечный формат (bitmap), вам следует использовать имя BMP. Систем Литерал есть системный литерал, который может быть ограничен одинарными (') или двойными (") кавычками и содержать любые символы, за исключением символа кавычек, используемого в качестве ограничителя. Вы можете включить в системный литерал любое описание формата, которое проинформирует приложение, как отображать или обрабатывать XML-документ. (Помните, что XML-процессор сам не использует информацию нотации; он просто передает ее приложению, в качестве которого может выступать сценарий на Web-странице.) Например, вы можете включить в системный литерал одно из следующих описаний.
Дополнительная информация об URI и примеры приведены в разделе «Использование только внешнего подмножества DTD» в главе 5.
Объявление параметрических примитивов Форма объявления разметки параметрического примитива аналогична форме объявления, используемой для общих примитивов. В последующих разделах вы узнаете, как объявлять оба типа параметрических примитивов.
Объявление параметрического внутреннего разбираемого примитива Объявление для параметрического внутреннего разбираемого примитива имеет следующую общую форму записи: <! ENTITY % ИмяПримитива ЗначениеПримитива> Здесь ИмяПримитива есть имя примитива. Вы можете выбрать любое имя, соблюдая следующие правила:
ЗначениеПримитива есть значение примитива. Значение, присваиваемое параметрическому примитиву, представляет собой группу символов, заключенных в кавычки (литерал). Вы можете присвоить параметрическому примитиву любое значение типа литерал, при соблюдении следующих правил:
Примечание. Приведенные здесь правила использования значений примитивов, которые вы можете без опасения применять в любых ситуациях, являются несколько упрощенными в отличие от правил, содержащихся в спецификации XML. Спецификация, в определенных обстоятельствах, разрешает вам включать в значение примитива дополнительные составляющие, а также помещать ссылку на примитив внутри разметки и между объявлениями разметки. Подробности приведены в разделе 4 спецификации XML, которую вы можете найти по адресу http://www.w3.org/TR/REC-xml. Например, следующее DTD объявляет параметрический внутренний не разбираемый примитив с именем author, который содержит три объявления разметки: комментарий, объявление типа элемента и объявление списка атрибутов. Содержимое примитива (т.е. замещающий его текст) помещается в конец DTD посредством ссылки на параметрический примитив (%author;);
Обратите внимание, что значение атрибута по умолчанию, которое содержится в объявлении примитива ('American'), ограничено одинарными кавычками, чтобы избежать использования такого же символа, который применяется для ограничения всего значения примитива. Приведенное выше DTD эквивалентно следующему:
Объявление параметрического внешнего разбираемого примитива Объявление для параметрического внешнего разбираемого примитива имеет следующую форму записи:
Здесь Имя Примитива есть имя примитива. Вы можете выбрать любое имя, следуя правилам задания имен для параметрических примитивов, приведенных в предыдущем разделе. Систем Литерал есть системный литерал, который описывает местонахождение файла, содержащего данные примитива. Системный литерал может быть заключен в одинарные (') или двойные (") кавычки и содержать любые символы, за исключением символа кавычек, который используется в качестве ограничителя. Системный литерал задает URI файла, содержащего данные параметрического примитива. В настоящее время URI практически аналогичен стандартному унифицированному указателю ресурса Internet (URL). Вы можете использовать как полностью заданный URI, например:
Либо вы можете использовать частичный URI, задающий местонахождение относительно местонахождения XML-документа, содержащего URI, например:
Относительные URI в XML-документах работают подобно относительным URL для HTML-страниц. Для более подробной информации об URI обратитесь к разделу «Использование только внешнего подмножества DTD» в главе 5. Файл параметрического внешнего примитива должен содержать полные объявления разметки всех типов, допустимых в DTD. В частности, он может содержать объявления типа элемента, объявления списка атрибутов, объявления примитивов, объявления нотаций, инструкции по обработке, или комментарии. (Эти типы объявлений разметки описаны в разделе «Создание DTD» в главе 5.) Вы также можете включать ссылки на параметрические примитивы и разделы INCLUDE и IGNORE. (См. раздел «Условное игнорирование разделов внешнего подмножества DTD» в главе 5.) Вы можете использовать параметрические внешние разбираемые примитивы для хранения группы взаимосвязанных объявлений. Допустим, вы занимаетесь продажей книг, CD-ROM, плакатов и другой продукции. Вы можете поместить объявления для каждого вида продукции в отдельный файл. Это позволит вам объединять эти группы объявлений различными способами. Например, вы хотели бы создать XML-документ, который описывает только имеющиеся у вас в наличии книги и CD-ROM. Для этого вы можете поместить объявления для книг и CD-ROM в DTD документа с помощью параметрических внешних разбираемых примитивов, как показано в следующем примере XML-документа:
Вот содержимое файла примитива Book.dtd:
А вот содержимое файла примитива CD.dtd:
Заметим, что параметрический внешний разбираемый примитив работает во многом аналогично внешнему подмножеству DTD. Параметрические внешние примитивы, однако, обеспечивают большую гибкость — они разрешают вам включать несколько файлов внешних объявлений, причем в любом порядке. (Напомним, что внешнее подмножество DTD всегда обрабатывается после того, как полностью будет обработано подмножество внутреннего DTD.)
Вставка ссылок на примитив Вставка содержимого (замещающий текст) примитива в документ осуществляется с помощью ссылок на примитив. Вы уже познакомились с несколькими примерами ссылок на примитив. Общий вид ссылки на общий примитив следующий:
а на параметрический примитив:
где Имя Примшпива есть имя, присваиваемое примитиву в объявлении. Исключением является общий внешний не разбираемый примитив, который вы не можете вставить с использованием ссылки. Единственный способ использования этого типа примитива заключается в присвоении его имени атрибуту, имеющему тип ENTITY или ENTITIES. (См. раздел «Задание маркерного типа» в главе 5.) Объявление примитива должно предшествовать любой ссылке на этот примитив. Для каждого типа примитива в представленной ниже таблице приведена форма записи ссылки на примитив и перечень возможных мест помещения ссылки на примитив. В таблице также приведены ссылки на разделы в этой главе, в которых вы можете найти примеры. О ссылках на символы речь пойдет далее в этой главе, но данный вид ссылок также включен в таблицу для полноты картины.
Ссылка на примитив Пример 1 В следующем XML-документе объявлены два общих внутренних разбираемых примитива, am и еn. Документ использует ссылку на am для присвоения значения по умолчанию атрибуту Nationality и ссылку на еn для присвоения значения атрибуту Nationality элемента AUTHOR. Преимущество использования примитива здесь заключается в том, что вы можете изменить значение по всему документу (в предположении, что в нем имеется много элементов) простым редактированием определения примитива (например, изменив значение еп с «English» на «British»).
Ссылка на примитив Пример 2 Следующее DTD определяет общий внутренний разбираемый примитив (int_entity) и общий внешний разбираемый примитив (ext_entity). Затем он определяет другой общий внутренний разбираемый примитив, combo_entity, и помещает оба предыдущих примитива в значение примитива combo_entity.
Вставка ссылок на символы Вы можете воспользоваться ссылкой на символ, чтобы вставить символ, которого нет на вашей клавиатуре (например, а), либо вставить символ, который не допускает его вставку в данном контексте как литерал (например, символы < или & в составе символьных данных элемента). Вам не нужно делать какие-либо определения перед использованием ссылки на символ — вы можете просто поместить ее в нужном месте. Ссылка на символ имеет две различные формы. Первая форма:
где 9 - это одна или несколько десятичных цифр (от 0 до 9), представляющих числовой код символа в наборе символов ISO/IEC 10646. Вторая форма ссылки на символ:
где h - это рдна или несколько шестнадцатиричных цифр (от 0 до F), также представляющих числовой код символа в наборе ISO/IEC 10646. Например, обе ссылки A и &#х41; означают вставку прописной буквы А. (Числовой код для А равен десятичному числу 65 и шестнадцате-ричному числу 41.) Международная таблица символов ISO/IEC 10646 используется для числового представления символов практически любых языков. (ISO -International Organization for Standardization, IEC - International Organization Commission.) Коды первых 128 символов совпадают с кодами хорошо известного набора ASCII, используемого в большинстве компьютеров. На представленном ниже рисунке содержатся первые 256 символов в наборе ISO/IEC 10646. Для каждого элемента на следующем рисунке первое число (1:, 2:, 3:, и т.д.) есть десятичный код символа, а после двоеточия следует символ — если он есть - в том виде, в котором он отображается Microsoft Internet Explorer 5.
Например, из рисунка вы можете определить, что десятичный код символа для а равен 228. Чтобы вставить этот символ в ваш документ, достаточно ввести ссылку:
Примечание. Список мест, в которые вы можете поместить ссылку на символ в вашем документе, приведен в таблице в разделе «Вставка ссылок а примитивы» ранее в этой главе. Там же приведены и примеры. Для следующего элемента символ левой угловой скобки (<) вставляется в символьные данные элемента с помощью ссылки на символ < (60 есть .сгятичный код для <). Напомним, что непосредственная вставка символа < в символьные данные не допускается.
Для следующего элемента ссылка на символ ä используется для вставкиI символа а (вы не можете ввести его с клавиатуры) в значение атрибута:
В следующем объявлении общего внутреннего разбираемого примитива в DTD ссылка на символ % используется для вставки символа процентов (%) (37 есть десятичный код для %), который не может быть непосредственно введен как литерал в значение внутреннего примитива:
Использование предварительно определенных примитивов В XML-документе вы можете использовать ссылку на заранее определенный примитив, чтобы вставить следующие пять стандартных символов в места, куда вставка символов как литералов не допускается:
Вставка этих ссылок на предопределенный примитив эквивалентна вставке соответствующей ссылки на символ. Ссылки на предопределенные примитивы легче запомнить, а документ при этом легче воспринимается. Эти предопределенные примитивы похожи на другие общие внутренние разбираемые примитивы, за исключением того, что ссылки на них вы можете использовать без определения примитивов и можете вставлять их в те же места, что и примитивы данного типа, а именно:
В следующих трех примерах ссылки на предопределенные примитивы используются для вставки символов, которые не допускается вставлять как литералы. В первом примере ссылка < используется для вставки в содержимое элемента левой угловой скобки (<):
Во втором примере ссылка &атр; используется для вставки амперсенда (&) в значение атрибута:
В третьем примере ссылка " используется для вставки двойных кавычек (") в значение примитива (их нельзя вставить как литерал, поскольку такие же кавычки используются как ограничители строки):
Объявление документа автономным (standalone) Вы можете включить объявление автономности (standalone) документа в XML-объявление (см. главу 3). Объявление standalone сообщает процессору, требуются ли внешние объявления для обработки документа. Если XML-документ имеет внешние объявления разметки (либо во внешнем подмножестве DTD, либо в параметрическом внешнем разбираемом примитиве), но ни одно из этих объявлений не оказывает влияния на содержимое документа, передаваемого XML-процессором приложению, вы можете установить для standalone значение 'yes' или "уск", как и следующем XML-объявлении:
Установка предотвращает ненужную обработку внешних файлов. Установка для standalone значения 'по' или "по" либо пропуск объявления standalone сообщает процессору, что он должен обработать все внешние объявления разметки, поскольку одно или несколько из них оказывают влияние на содержимое документа. Если вы хотите познакомиться с типами внешней разметки, которые влияют на содержимое документа (и следовательно, не допускают установку для standalone значения "yes"), обратитесь к разделу 9 спецификации XML, которую можете найти по адресу http://www.w3.org/TR/REC-xml.
Добавление примитивов в документ В следующем упражнении вы получите некоторый опыт работы с примитивами, добавив несколько общих примитивов в документ Inventory Valid.xml, созданный вами в главе 5.
Добавьте примитивы в документ
Рубрика: Учебник по XML
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|