Базовая основа синтаксический анализатор 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.
Чтобы кратко проиллюстрировать, как эти структуры используются синтаксическим анализатором, считайте еще раз 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 является надлежащим:
Вы хотите подстроенное управление процесса парсинга.
Вам нужен доступ к данным в очень большом XML-документе и преобразовании всего документа в a
CFXMLTreeобъект требует слишком большого количества памяти.A
CFXMLTreeобъект является несоответствующим для потребностей Вашего приложения, и Вы хотите создать пользовательскую структуру данных из содержания XML-документа.Вы хотите обеспечить дополнительную проверку ошибок как анализирующий прогресс.
Вы хотите управлять, когда и как загружаются внешние объекты.
Для этих и других ситуаций можно использовать основанный на обратном вызове событийно-управляемый 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.
Флаг | Описание | Состояние |
|---|---|---|
| Проверьте документ против его схемы DTD, сообщив о любых ошибках. | Не поддерживаемый |
| Тихо перескочите через конструкции метаданных (DTD и комментарии). | Поддерживаемый |
| Замените объявленные объекты как | Не поддерживаемый |
| Перескочите через весь пробел, не примыкающий к данным непробельного символа. Например, данный | Поддерживаемый |
| Где DTD указывает подразумеваемых пар значения атрибута для определенного элемента, добавьте тех пар к любым случаям элемента в дереве элемента. | Не поддерживаемый |
| Все поддерживаемые опции. | Поддерживаемый |
| Никакие опции. | Поддерживаемый |
Раздел Используя Событийно-управляемый Интерфейс Синтаксического анализатора показывает Вам, как проанализировать XML-документ с помощью событийно-управляемого синтаксического анализатора API.