Возможности синтаксического анализатора и архитектура
Существует два общих подхода к парсингу и обработке XML, каждый с его собственным стилем API:
Основанный на дереве API: Этот подход отображает XML-документ во внутреннюю древовидную структуру, соответствующую логической структуре, описанной схемой, затем упрощающую навигацию и манипулирование тем деревом. Много основанных на дереве APIs доступны, включая DOM (Объектная модель документа), предложенная Консорциумом World Wide Web (W3C). Язык пути XML (XPath), Включения XML (XInclude) и Язык Указателя XML (XPointer) является программируемыми интерфейсами WC3 для того, чтобы запросить и обработать XML в древовидных структурах СТИЛЯ DOM.
Событийно-управляемый API: В этом подходе события парсинга отчетов синтаксического анализатора (такие как запуск и конец каждого элемента) к приложению, поскольку это встречается с ними. В APIs на базе С это создание отчетов выполняется посредством обратных вызовов, реализованных приложением для обработки типов событий. SAX является самым известным примером этого стиля парсинга API. Этот тип синтаксического анализатора иногда упоминается как синтаксический анализатор потоковой передачи.
Класс NSXMLParser принимает событийно-управляемый стиль парсинга. Но вместо того, чтобы использовать обратные вызовы, объект NSXMLParser (или просто, синтаксический анализатор) отправляет сообщения своему делегату; это отправляет различное сообщение за каждым типом парсинга события. Поскольку синтаксический анализатор последовательно встречается с каждым элементом в XML или файле DTD — элемент, атрибут, объявление, ссылка на сущность, и т.д. — это сообщает о нем своему делегату (если делегат реализует связанный метод), вместе с любым окружающим контекстом. Это ничего не делает с элементом кроме отчета это.
Например, скажите, что у Вас есть простой XML-файл, такой как следующее:
<?xml version= “1.0” encoding=”UTF8”> |
<article author=”John Doe”> |
<para>This is a very short article.</para> |
</article> |
Синтаксический анализатор сообщил бы о следующей серии событий его делегату:
Запущенный документ парсинга
Найденный запускают тег для элемента
article
Найденный атрибут
author
из элементаarticle
, значение «Джон Доу»Найденный запускают тег для элемента
para
Найденные символы
This is a very short article.
Найденный конечный тэг для элемента
para
Найденный конечный тэг для элемента
article
Законченный документ парсинга
И основанные на дереве и основанные на событии подходы парсинга имеют свои сильные места и недостатки. Это может потребовать, чтобы значительные объемы памяти создали внутреннее дерево, представляющее XML-документ, особенно если тот документ является большим. Эта проблема составлена, если становится необходимо отобразить древовидную структуру проанализированного документа специализированной древовидной структуре более со строгим контролем типов.
Событийно-управляемый парсинг — потому что это имеет дело только с одной конструкцией XML за один раз и не всеми ими сразу — использует намного меньше памяти, чем основанный на дереве парсинг. Это идеально для ситуаций, где производительность является целью, и модификация проанализированного XML не. Одно такое приложение для событийно-управляемого парсинга ищет репозиторий XML-документов (или даже одного XML-документа с многократными «записями») для определенных элементов и делает что-то с содержанием элемента. Например, Вы могли использовать NSXMLParser для поиска предпочтительных файлов списка свойств на всех машинах в сети Bonjour для сбора информации конфигурации сети.
Событийно-управляемый парсинг менее подходит для задач, требующих, чтобы XML был подвергнут расширенным пользовательским запросам или был изменен и записан обратно к файлу. Событийно-управляемые синтаксические анализаторы, такие как NSXMLParser также не предлагают помощи с проверкой (т.е. это проверяющий, соответствует ли XML правилам структурирования, как указано в DTD или другой схеме). Для этих видов задач Вам нужно дерево СТИЛЯ DOM. Однако можно создать собственные внутренние древовидные структуры с помощью событийно-управляемого синтаксического анализатора, такие как NSXMLParser.
В дополнение к созданию отчетов о событиях парсинга объект NSXMLParser проверяет, что XML или DTD правильно построены. Например, это проверяет, имеет ли тег запуска для элемента соответствующий конечный тэг или присвоили ли атрибуту значение. Если это встречается с синтаксической ошибкой, это прекращает анализировать и сообщает делегату.
Несмотря на то, что синтаксический анализатор «понимает» только XML и DTD как языки разметки, это может проанализировать любую основанную на XML схему языка, такую как RELAX NG и XML-схема.