Смекни!
smekni.com

Трансформация XML документов (стр. 3 из 6)

<color RGB="true">#ff08ff</color>

<color RGB="false">white</color>

или

<author id=0>Ivan Petrov</author>

Специальные символы

Для того, чтобы включить в документ символ, используемый для определения каких-либо конструкций языка (например, символ угловой скобки) и не вызвать при этом ошибок в процессе разбора такого документа, нужно использовать его специальный символьный либо числовой идентификатор. Например, &lt; , &gt; &quot; или &#036;(десятичная форма записи), &#x1a (шестнадцатеричная) и т.д. Строковые обозначения спецсимволов могут определяться в XML документе при помощи компонентов (entity).

Директивы анализатора

Инструкции, предназначенные для анализаторов языка, описываются в XML документе при помощи специальных тэгов - <? и ?>;. Программа клиента использует эти инструкции для управления процессом разбора документа. Наиболее часто инструкции используются при определении типа документа (например, <? Xml version=”1.0”?>) или создании пространства имен.

CDATA

Чтобы задать область документа, которую при разборе анализатор будет рассматривать как простой текст, игнорируя любые инструкции и специальные символы, но, в отличии от комментариев, иметь возможность использовать их в приложении, необходимо использовать тэги <![CDATA] и ]]>. Внутри этого блока можно помещать любую информацию, которая может понадобится программе- клиенту для выполнения каких-либо действий (в область CDATA, можно помещать, например, инструкции JavaScript). Естественно, надо следить за тем, чтобы в области, ограниченной этими тэгами не было последовательности символов ]].

3. Моделирование XML-документов

Одним из наиболее сильных свойств XML является возможность создавать собственные языки разметки, в которых определяются элементы и атрибуты, наилучшим образом соответствующие инкапсулируемой информации, и снимаются ограничения, вызываемые малопригодным языком общего назначения. Однако пока нельзя определить язык формальным образом, ограничить словарь элементов и атрибутов поддающимся управлению множеством и управлять грамматикой элементов. Процесс формального определения языка в XML называется моделированием документов. На сегодняшний день существует два способа моделирования документов: определения типа документа (DTD), которые описывают структуру документа с помощью декларативных правил, и XML Schema, описывающую структуру документа на примере с помощью шаблонов элементов.

Модель определяет документы, которые можно создать с помощью языка; или, в рамках терминологии XML, модель документа устанавливает, какие документы согласуются (conform) с языком. Модель документа отвечает на такие вопросы, как «Может ли быть заголовок у данного элемента?» или «Должна ли быть указана цена для этого элемента?» Модель является документом особого рода, написанным по правилам синтаксиса, предназначенного для описания языков XML, и явно описывает грамматику и словарь отдельного языка разметки. Иногда язык, который она описывает, называют типом документа (document type) или приложением XML (XML application). С помощью такой модели можно определить, согласуется ли некоторый документ XML с данным типом документа.

Фактически написанные кем-то документы, называемые экземплярами документа (document instances), могут согласоваться с языком, описанным в модели документа или не согласоваться. Согласующиеся документы называют действительными (valid) в контексте языка; другие документы называют недействительными (invalid).

Модель документа может быть лишним грузом, если надо сопровождать лишь один-два документа, но если документов много, а требования к качеству высоки, ее создание может окупиться. Вот некоторые ситуации, в которых модель документа в состоянии облегчить жизнь:

● Документы создаются людьми и являются данными для компьютерной программы. Программы особенно привередливы в отношении форматов данных, потому что трудно создавать программы, способные справляться с отклонениями от формата. Ограничив применяемый шаблон предсказуемым форматом, намного легче писать программы, а вероятность ошибок уменьшается. Сравнение каждого экземпляра документа с моделью гарантирует, что вы не столкнетесь с проблемой несоответствия.

● В документе обязательно должны быть поля. Например, в бланке заказа изделия необходимо указать почтовый адрес, чтобы знать, куда отправлять посылку. Применение модели документа обеспечивает присутствие всех необходимых полей.

● Вы запрашиваете документы у людей, не знакомых с используемым приложением XML. Так как модель сама является документом, она может быть открытым ресурсом, доступным для загрузки, ссылок и передачи. Модель документа может выступать в качестве данных в средах создания структурированных документов, например, в редакторе XML. В такой программе редактор может автоматически вставлять необходимые поля и предлагать разработчику документа списки допустимых групп элементов.

● Разработчику нужна надежная структура для развивающегося языка или семейства языков. Модель документа предоставляет простой способ создания стандарта, такого, например, как HTML Version 4.0. Отслеживание новых версий языка жизненно важно для программ XML, поскольку старые программы могут оказаться несовместимыми с более новыми версиями языка. Модели документов можно объединить для создания составных языков. Например, DocBook использует модель таблиц CALS, а не пытается определить свою.

Конечно, могут быть основания и не использовать модель документов. Сопровождение модели может оказаться неудобным, особенно в начале, когда язык подвергается тестированию и дальнейшей разработке. Она может замедлить обработку, например, если браузеры XML должны загружать модель документа из сети. Наконец, наличие авторитарной модели, указывающей, какие элементы можно использовать, а какие – нет, может просто сломать стиль работы. А, кроме того, нужно потратить силы на то, чтобы разработать модель или найти готовую, отвечающую потребностям. В конечном счете, автор сам решает, использовать модель документа или нет: XML спроектирован так, что позволяет работать в любом случае.

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

4. Documents Type Definitions (DTD)

В XML-документах DTD определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис DTD весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность DTD является одной из причин того, что использование SGML, требующего определение DTD для любого документа, не получило столь широкого распространения как, например, HTML). Как уже отмечалось, в XML использовать DTD не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса XML. Однако контроль над типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его может использовать только его автор, и для этого применять специально разработанное программное обеспечение, а не универсальные программы-анализаторы. В DTD для XML используются следующие типы правил: правила для элементов и их атрибутов, описания категорий(макроопределений), описание форматов бинарных данных. Все они описывают основные конструкции языка - элементы, атрибуты, символьные константы внешние файлы бинарных данных. Для того, чтобы использовать DTD в документе, можно или описать его во внешнем файле и при описании DTD просто указать ссылку на этот файл или же непосредственно внутри самого документа выделить область, в которой определить нужные правила. В первом случае в документе указывается имя файла, содержащего DTD-описания:

<?xml version="1.0" standalone="yes" ?>

<! DOCTYPE team SYSTEM "team.dtd">

...

Внутри же документа DTD- декларации включаются следующим образом:

...

<! DOCTYPE team [

<! ELEMENT team (coach, player, assistant)>

...

]>

...

В том случае, если используются одновременно внутренние и внешние описания, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа XML-процессор в первую очередь ищет DTD внутри документа. Если правила внутри документа не определены и не задан атрибут standalone ="yes" , то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут standalone имеет значение "yes", то использование внешних DTD описаний будет запрещено.

Определение элемента

Элемент в DTD определяется с помощью дескриптора !ELEMENT, в котором указывается название элемента и структура его содержимого. Например, для элемента <coach> можно определить следующее правило:

<!ELEMENT coach PCDATA>

Ключевое слово ELEMENT указывает, что данной инструкцией будет описываться элемент XML. Внутри этой инструкции задается название элемента(coach) и тип его содержимого. В определении элемента мы указываем сначала название элемента(coach), а затем его модель содержимого - определяем, какие другие элементы или типы данных могут встречаться внутри него. В данном случае содержимое элемента name будет определяться при помощи специального маркера PCDATA( что означает parseable character data - любая информация, с которой может работать программа-анализатор). Существует еще две инструкции, определяющие тип содержимого: EMPTY,ANY. Первая указывает на то, что элемент должен быть пустым(например, <red/>), вторая - на то, что содержимое элемента специально не описывается. Последовательность дочерних для текущего элемента объектов задается в виде списка разделенных запятыми названий элементов. При этом для того, чтобы указать количество повторений включений этих элементов могут использоваться символы +,*, ? :