Подсказки по проверке и методы

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

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

Поскольку программируемый интерфейс NSXMLParser разработан для создания отчетов только о конструкциях XML и объявлениях DTD, эта статья внимание на ту схему языка. Однако при использовании основанной на XML схемы языка, такой как RELAX NG, тогда NSXMLParser может обработать схему просто, это было бы как любой XML-файл, сообщая, что это находит его делегату. Можно использовать данные, которые Вы, таким образом, получаете для проверки.

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

Используя NSXMLParser для обработки объявлений DTD

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

Методы делегации DTD

Класс NSXMLParser определяет полдюжину методов делегации, которые вызывает синтаксический анализатор, когда синтаксический анализатор встречается с объявлением DTD во внутреннем или внешнем источнике. Эти методы имеют форму:

parser:foundВвестиDeclarationWithName:...

Третий параметр и любые последующие параметры зависят от типа объявления. Следующий список кратко описывает методы делегации NSXMLParser, связанные с объявлениями DTD.

- parser:foundElementDeclarationWithName:model:

Пример: <!ELEMENT dictionary (documentation?, suite+)>

- parser:foundAttributeDeclarationWithName:forElement:type:defaultValue:

Пример: <!ATTLIST dictionary title CDATA #IMPLIED >

- parser:foundInternalEntityDeclarationWithName:value:

Пример: <!ENTITY % OSType "CDATA">

- parser:foundExternalEntityDeclarationWithName:publicID:systemID:

Пример: <!ENTITY name SYSTEM “name.xml”>

- parser:foundNotationDeclarationWithName:publicID:systemID:

Пример: <!NOTATION img PUBLIC “urn:mime:image/jpeg”>

- parser:foundUnparsedEntityDeclarationWithName:publicID:systemID: notationName:

Пример: <!ENTITY corplogo SYSTEM “logo.jpg” NDATA img>

Разрешение внешних объектов DTD

XML-документ, в DOCTYPE объявление, происходящее около его начала, часто идентифицирует внешний файл DTD, объявления которого предписывают его логическую структуру. Например, следующий DOCTYPE объявление говорит, что DTD, связанный с корневым элементом «адреса», может быть расположен системным идентификатором «addresses.dtd».

<!DOCTYPE addresses SYSTEM "addresses.dtd">

Часто системный идентификатор принимает стандартное расположение файловой системы для DTDs — например, /System/Library/DTDs. В начале обработки делегату NSXMLParser дают возможность разрешить этот внешний объект и дать синтаксическому анализатору список объявлений DTD для парсинга.

  1. При подготовке экземпляра NSXMLParser отправьте его setShouldResolveExternalEntities: с параметром YES.

  2. Реализуйте метод делегации parser:resolveExternalEntityName:systemID: возвратить объявления во внешнем файле DTD как объект NSData.

Если объявления DTD будут внутренними к XML-документу, то делегат получит сообщения объявления DTD автоматически (предположение, конечно, что он реализует связанные методы).

Построение правил для элементов

Так же, как элементы обычно являются наиболее распространенным видом конструкции в XML-документе, объявления элемента являются наиболее распространенным видом объявления в DTD. Они выражают правила для состава элементов от дочерних элементов, текста и других составляющих.

Объявление элемента имеет три части: !ELEMENT ключевое слово, имя элемента и модель содержания. Модель содержания - все после имени до завершающейся угловой скобки. Рассмотрите следующие примеры:

<!ELEMENT cocoa EMPTY>
<!ELEMENT keyboard (layouts+, modifierMap+, keyMapSet+, actions*, terminators*)>
<!ELEMENT dict (key, %plistObject;)*>
<!ELEMENT string (#PCDATA)>

Модель содержания не может указать содержание (EMPTY), любое содержание (ANY, который редок), текстовое содержание (#PCDATA), и дочерние элементы. Это может идентифицировать дочерние элементы по имени или ссылкой на сущность (такой как %plistObject; в третьем примере выше). Модель может также указать смешанное содержание — т.е. элемент может содержать текст и дочерние элементы в любом порядке. Через модификаторы возникновения (*, +, ?) и другие синтаксические соглашения, модель содержания может также указать порядок дочерних элементов, требуется ли элемент или дополнительный, сколько раз элемент может произойти, и приемлемый выбор между элементами. Модификаторы возникновения могут быть применены к группам элементов (в круглых скобках), а также отдельные элементы.

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

Таблица 1 перечисляет самые важные правила, получаемые от модели содержания объявления элемента.

Таблица 1  Возможные правила для проверки элемента

Правило

Демонстрационная модель содержания

Комментарии

Текстовое содержание только

(#PCDATA)

Смешанное содержание

(#PCDATA | bold | italic)

Вертикальные панели в этом случае имеют значение, отличающееся от выбора; когда #PCDATA присутствует, они означают, что могут быть смешаны текст и дочерние элементы.

Никакое содержание

EMPTY

Для значений типа флага.

Требуемая последовательность

(name, address, phone)

Запятые указывают предписанную последовательность.

Выбор

(read | write | readwrite)

Без #PCDATA быть элементом (см. Смешанное содержание), вертикальные панели означает, что должен использоваться один из перечисленных элементов.

Происходит точно один раз

(name, address, phone)

Никакой знак препинания модификатора. Может примениться к отдельному элементу или группе.

Происходит нуль или больше раз

(%plistObject;)*

Модификатор возникновения является звездочкой (“*”). Может примениться к отдельному элементу или группе.

Происходит один или несколько раз

(property+)

Модификатор возникновения является знаком «плюс» (“+”). Может примениться к отдельному элементу или группе.

Происходит нуль или одно время

(%implementation;?)

Модификатор возникновения является вопросительным знаком (“?”). Может примениться к отдельному элементу или группе.

Построение правил для атрибутов

Элементы часто имеют атрибуты, связанные с ними, и со следовательно объявлениями списка атрибутов часто встречаются в DTDs. Объявления списка атрибутов указывают правила для атрибутов с помощью синтаксиса, отличающегося от объявлений элемента. Они указывают, в порядке, связанном элементе, имени атрибута, типе атрибута и значении по умолчанию. Например, объявление

<!ATTLIST modifierMap defaultIndex NMTOKEN #REQUIRED >

состояния, что defaultIndex атрибут, связанный с modifierMap элемент, имеет тип NMTOKEN (подразумевать, что это должно быть допустимое имя XML); #REQUIRED ключевое слово, данное как значение по умолчанию, означает, что должно быть предоставлено значение для атрибута.

Когда экземпляр NSXMLParser встречается с объявлением списка атрибутов, он отправляет parser:foundAttributeDeclarationWithName:forElement:type:defaultValue: его делегату. Переданный в, поскольку параметры являются названием атрибута, связанным элементом, типом атрибута и его значением по умолчанию. Правила для атрибутов происходят из комбинаций последних двух параметров (тип и значение по умолчанию). Таблица 2 перечисляет некоторых возможные правила, что можно создать из объявлений списка атрибутов.

Таблица 2  Возможные правила для проверки атрибута

Правило

Ключевые слова или пример

Тип или значение по умолчанию

Комментарии

Уникальное значение

ID

ввести

Значение атрибута должно быть уникальным в XML-документе.

Требуемое значение

#REQUIRED

значение по умолчанию

Значение атрибута должно быть указано в документе.

Относится к уникальному значению атрибута

IDREF | IDREFS

ввести

Значение должно относиться к допустимому ID- введите значение в другом месте в документе. IDREFS указывает список ID ссылки (в круглых скобках).

Допустимое имя XML

NMTOKEN | NMTOKENS

ввести

Значение должно быть допустимым именем XML (включая ссылки на сущность). NMTOKENS указывает список имен XML (в круглых скобках).

Значение фиксируется

#FIXED “value”

значение по умолчанию

Значение должно быть «значением».

Допустимые XML называют в списке

(name | address | phone)

ввести

Перечисление атрибута: значение должно быть одним из имен XML в круглых скобках.

Допустимый определенный тип в списке

NOTATION (tiff | gif | jpg)

ввести

Перечисление атрибута: значение должно быть одним из определенных типов в круглых скобках.

Обработка других объявлений

Другие объявления DTD, такие как те для объектов и нотаций менее распространены, чем объявления элемента и объявления списка атрибутов. Можно легко получить конструкции правила для этих других объявлений после рассмотрения некоторой документации DTD. Однако существует несколько вещей иметь в виду: