Базовая основа синтаксический анализатор XML

Базовая Основа обеспечивает синтаксический анализатор, который Ваши приложения могут использовать для чтения данных в формате XML. Синтаксический анализатор базовой Основы XML имеет два интерфейса программирования, один основанный на дереве и другое событийно-управляемое. Основанный на дереве интерфейс анализирует XML-документ и возвращает данные Вам в форме a CFXMLTreeRef объект. Существует также конфигурируемый, основанный на обратном вызове API, позволяющий событийно-управляемый парсинг XML-документа. Событийно-управляемый парсинг позволяет Вам настраивать поведение синтаксического анализатора, таким образом, Ваше приложение может только реагировать на определенные конструкции XML, интересующие Вас. Событийно-управляемый парсинг также полезен для больших документов, потому что синтаксический анализатор не должен создавать все дерево в памяти. Однако основанный на дереве парсинг позволяет Вам добавлять или изменять узлы в древовидной структуре, и таким образом изменять исходный XML-документ.

Объекты CFXMLNode

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

Каждый CFXMLNode объект содержит три основных данные — тип узла, строка данных и указатель на структуру данных с дополнительной информацией. Вы извлекаете эти данные с помощью простых функций средства доступа. Тип узла кодируется как перечисление постоянное описание типа структуры XML. Строка данных всегда a CFString объект; значение строки зависит от идентификатора типа узла. Формат дополнительных данных также зависит от типа узла; существует определенная структура для каждого типа, требующего дополнительных данных.

Поскольку это обрабатывает XML-документ, синтаксический анализатор преобразовывает каждую конструкцию XML, с которой это встречается в a CFXMLNode объект, представляющий ту конструкцию. Например, при парсинге документа, показанного в Перечислении 1, синтаксический анализатор реагировал бы на тег <birthday> путем создания нового CFXMLNode чей тип узла был бы установлен в идентификатор kCFXMLNodeTypeElement. CFXMLNode строка данных содержала бы CFString возразите «дню рождения», и дополнительный указатель данных указал бы на a CFXMLElementInfo структура, содержащая информацию об атрибутах элемента.

Для обработки некоторых более сложных объектов XML Базовая Основа определяет несколько дополнительных структур данных. Структуры, содержащие дополнительную информацию, описаны кратко в Таблице 1.

Таблица 1  структуры дополнительной информации синтаксического анализатора XML

Структура

Описание содержания

CFXMLElementInfo

Список атрибутов элемента.

CFXMLProcessingInstructionInfo

Инструкция обработки.

CFXMLDocumentInfo

Источник URL для документа вместе с информацией о кодировке символов.

CFXMLDocumentTypeInfo

Система и общедоступный IDs для DTD.

CFXMLNotationInfo

Система и общедоступный IDs для нотации.

CFXMLElementTypeDeclarationInfo

Строка, описывающая допустимое содержание элемента.

CFXMLAttributeDeclarationInfo

Имя объявляемого атрибута, строка, описывающая тип атрибута и значение по умолчанию атрибута.

CFXMLAttributeListDeclarationInfo

Список CFXMLAttributeDeclarationInfo структуры.

CFXMLEntityInfo

Тип объекта, текст, которым заменят объект, когда ссылается, расположение объекта (для внешних объектов), и имя нотации объекта, если не анализируется объект.

CFXMLEntityReferenceInfo

Тип ссылки на сущность.

Чтобы кратко проиллюстрировать, как эти структуры используются синтаксическим анализатором, считайте еще раз XML-документ показанным в Перечислении 1. Четвертая строка документа содержит тег <address region="USA">. Строка region="USA" определяет вызванный атрибут элемента region чье строковое значение USA. Атрибуты элемента являются способом связать дополнительные данные с данным элементом.

Синтаксический анализатор XML возвращает атрибуты тега Вашему приложению как a CFXMLElementInfo структура. Эта структура показана в Перечислении 1.

Перечисление 1  структура CFXMLElementInfo

typedef struct {
    CFDictionaryRef attributes;
    CFArrayRef attributeOrder;
    Boolean isEmpty;
} CFXMLElementInfo;

При парсинге этого тега синтаксический анализатор создает a CFXMLNode возразите, чей код типа kCFXMLNodeTypeElement, и чья строка данных “address”. Указатель дополнительной информации установлен указать на a CFXMLElementInfo структура, описывающая элемент и его атрибуты. attributes поле содержит a CFDictionary объект, содержащий данные атрибута в формате ключа/значения. attributeOrder поле содержит a CFArray объект, содержащий attributes словарь вводит порядок, с ними встретились. Булево значение isEmpty поле указывает, пуст ли элемент. Посмотрите, что Наборы Программируют Темы для Базовой Основы для получения дополнительной информации о CFDictionary и CFArray.

Основанный на дереве синтаксический анализатор API

Основанный на дереве синтаксический анализатор API обеспечивает очень простой метод для чтения данных XML. Один вызов к функции CFXMLTreeCreateFromData читает весь XML-документ — указанный указателем на данные XML в памяти, или строкой URL — и возвращает данные XML Вам в форме a CFXMLTree объект. A CFXMLTree объект просто a CFTree объект, содержащий указатель на a CFXMLNode объект в контексте каждого узла. Посмотрите, что Наборы Программируют Темы для Базовой Основы для получения дополнительной информации о CFTreeRef и его API.

Один раз CFXMLTree объект был создан, можно использовать CFTree API для исследования дерева и информации о выдержке от данного узла. Базовая Основа также обеспечивает функции удобства, делающие еще проще получить доступ к содержанию a CFXMLTree объект. Например, CFXMLTreeGetNode берет ссылку на один из узлов дерева и возвращает указатель на тот узел.

Раздел Используя Основанный на дереве Интерфейс Синтаксического анализатора показывает Вам, как проанализировать, исследовать, и изменить XML-документ с помощью основанного на дереве синтаксического анализатора API.

Событийно-управляемый синтаксический анализатор API

Основанный на дереве синтаксический анализатор XML API достаточен для многих потребностей. Однако существуют некоторые случаи где с помощью событийно-управляемого интерфейса CFXML является надлежащим:

Для этих и других ситуаций можно использовать основанный на обратном вызове событийно-управляемый API. Этот API несколько более сложен для использования, но обеспечивает намного больше гибкости, чем основанный на дереве API.

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

Обратные вызовы синтаксического анализатора

Для использования событийно-управляемого синтаксического анализатора необходимо реализовать три из этих пяти обратных вызовов, описал в этом разделе —CFXMLParserCreateXMLStructureCallBack, CFXMLParserAddChildCallBack, и CFXMLParserEndXMLStructureCallBack. Другие обратные вызовы являются дополнительными.

CFXMLParserCreateXMLStructureCallBack когда синтаксический анализатор встречается с новой структурой XML, функция вызвана. Это передает указатель на CFXMLNode. Если возвращается функция NULL, синтаксический анализатор пропускает структуру.

CFXMLParserAddChildCallBack когда синтаксический анализатор встречается с дочерней структурой, функция вызвана. Это уведомляет Вас относительно отношений отцов и детей и передает данные, из которых Вы возвратились CFXMLParserCreateXMLStructureCallBack и для родителя и для дочернего элемента.

CFXMLParserEndXMLStructureCallBack когда синтаксический анализатор выходит из структуры XML, о которой сообщают, функция вызвана CFXMLParserCreateXMLStructureCallBack. Это передает данные, из которых Вы возвратились CFXMLParserCreateXMLStructureCallBack.

CFXMLParserResolveExternalEntityCallBack когда синтаксический анализатор встречается с внешней ссылкой на сущность XML, функция вызвана. Это передает publicID и systemID данные для объекта. Вам решать для загрузки данных, если Вы желаете и возвращаете его как CFData. Не в настоящее время поддерживаемый.

CFXMLParserHandleErrorCallBack когда синтаксический анализатор встречается с состоянием ошибки, вызывается. Это передает код ошибки, указывающий природу ошибки. Из Вашего обработчика ошибок можно использовать функцию CFXMLParserCopyErrorDescription получить CFString описание состояния ошибки. Можно также использовать функции CFXMLParserGetLineNumber и CFXMLParserGetLocation изучить точное расположение ошибки в XML-документе.

В любой точке во время парсинга Вас может использовать функцию CFXMLParserGetStatusCode узнать то, что делает синтаксический анализатор. Можно также вызвать CFXMLParserAbort сигнализировать ошибку.

Флаги опции синтаксического анализатора

Существуют различные варианты, которые можно использовать для конфигурирования поведения синтаксического анализатора. Флаг опции 0, или kCFXMLParserNoOptions, оставляет XML максимально «неповрежденным». Другими словами, эта опция заставляет синтаксический анализатор сообщать обо всех структурах и не выполняет замен объекта. Чтобы заставить синтаксический анализатор сделать, большая часть работы, возвращая только чистое дерево элемента, установила флаг опции в kCFXMLParserAllOptions.

  Флаги опции Table 2 Parser

Флаг

Описание

Состояние

kCFXMLParserValidateDocument

Проверьте документ против его схемы DTD, сообщив о любых ошибках.

Не поддерживаемый

kCFXMLParserSkipMetaData

Тихо перескочите через конструкции метаданных (DTD и комментарии).

Поддерживаемый

kCFXMLParserReplacePhysicalEntities

Замените объявленные объекты как &lt;.

Не поддерживаемый

kCFXMLParserSkipWhitespace

Перескочите через весь пробел, не примыкающий к данным непробельного символа. Например, данный <foo> <bar> blah </bar></foo>, пробел между открытым тегом foo и открытым тегом панели был бы подавлен, но будет сохранен пробел вокруг вздора.

Поддерживаемый

kCFXMLParserAddImpliedAttributes

Где DTD указывает подразумеваемых пар значения атрибута для определенного элемента, добавьте тех пар к любым случаям элемента в дереве элемента.

Не поддерживаемый

kCFXMLParserAllOptions

Все поддерживаемые опции.

Поддерживаемый

kCFXMLParserNoOptions

Никакие опции.

Поддерживаемый

Раздел Используя Событийно-управляемый Интерфейс Синтаксического анализатора показывает Вам, как проанализировать XML-документ с помощью событийно-управляемого синтаксического анализатора API.