Открыть сервис

SAX

SAX (аббр. от англ. Simple API for XML — простой интерфейс для XML) — это программный интерфейс (API) для последовательного чтения и обработки XML-документов. В отличие от модели DOM (Document Object Model), которая загружает весь документ в оперативную память в виде древовидной структуры, SAX основан на событийно-ориентированной модели (event-driven parsing): анализатор читает XML-поток и генерирует события (например, «начало элемента», «текстовое содержимое», «конец элемента») по мере обнаружения соответствующих конструкций в документе. Обработка этих событий возлагается на пользовательский код, реализующий специальные обработчики (handlers). SAX является потоковым (streaming) и однопроходным (single-pass) парсером, что обеспечивает низкое потребление памяти и высокую скорость работы, но не позволяет произвольно перемещаться по уже прочитанным данным.

История возникновения

SAX был разработан в конце 1990-х годов участниками XML-сообщества, в первую очередь Дэвидом Меджимором (David Megginson) и при участии членов списка рассылки XML-DEV. Первая версия спецификации (SAX 1.0) была опубликована в мае 1998 года. Основной мотивацией создания SAX стало отсутствие лёгкого, быстрого и экономного по памяти способа работы с XML на платформе Java, где стандартный DOM-парсер требовал загрузки всего документа в память. SAX 2.0, выпущенный в 2000 году, ввёл пространства имён (namespaces) и более гибкую систему фильтрации событий. Несмотря на то что SAX изначально создавался для Java, его концепция была адаптирована для многих других языков программирования, включая C++, Python, PHP, C#, Perl, JavaScript (через сторонние библиотеки) и Ruby.

Принцип работы

Событийная модель

SAX-парсер последовательно читает XML-документ как поток символов. При обнаружении синтаксических конструкций XML он вызывает соответствующие методы, заранее зарегистрированные в обработчике (ContentHandler в Java). Основные типы событий:

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

Пример работы

Для XML-фрагмента <book isbn="123">Текст</book> парсер сгенерирует последовательность событий:

  1. startElement("", "book", "book", Attributes[isbn="123"])
  2. characters("Текст", 0, 5)
  3. endElement("", "book", "book")

Если разработчику нужно, например, извлечь ISBN всех книг, он в методе startElement проверяет имя элемента и сохраняет значение атрибута.

Управление пространствами имён

В SAX 2.0 поддержка пространств имён реализована через передачу URI пространства имён и локального имени элемента. Парсер может работать в двух режимах: с обработкой пространств имён (тогда localName и uri заполняются) и без неё (тогда qName содержит полное имя с префиксом).

Классификация

SAX относится к классу потоковых XML-парсеров. Внутри этого класса выделяют:

SAX является push-моделью.

Преимущества и недостатки

Преимущества

Недостатки

Применение

SAX широко используется в задачах, где требуется обработка больших объёмов XML-данных без загрузки их в память:

Реализации для различных языков

Java

C++

Python

PHP

C#

JavaScript

Сравнение с DOM и StAX

ХарактеристикаSAXDOMStAX (Pull)
МодельСобытийная (push)ДревовиднаяПотоковая (pull)
Потребление памятиНизкоеВысокое (весь документ)Низкое
Произвольный доступНетДаНет
Простота использованияСредняя (нужно управлять состоянием)Высокая (интуитивно понятная структура)Средняя
СкоростьВысокаяНизкая (из-за построения дерева)Высокая
Возможность модификацииНетДаНет (только чтение)
Типичное применениеБольшие файлы, импортНебольшие файлы, сложные манипуляцииПотоковая обработка с контролем

Интересные факты

Критика

Основная критика SAX связана с его событийной моделью, которая усложняет обработку вложенных иерархических структур. Разработчику приходится явно отслеживать глубину вложенности и контекст с помощью стека, что приводит к ошибкам при сложных XML-схемах. Кроме того, невозможность отменить чтение или вернуться назад делает SAX непригодным для интерактивных сценариев. В ответ на эти недостатки был создан StAX (Pull-модель), который предоставляет более естественный для программиста способ управления потоком. Тем не менее SAX остаётся востребованным в высоконагруженных системах, где критична скорость и минимальное потребление памяти.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →