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

JSR-173

JSR-173 (Java Specification Request 173) — это спецификация в рамках Java Community Process (JCP), определяющая стандартный потоковый API для синтаксического анализа XML (StAX — Streaming API for XML). JSR-173 предоставляет двунаправленный, основанный на событиях интерфейс для чтения и записи XML-документов, альтернативный DOM (Document Object Model) и SAX (Simple API for XML). Спецификация была принята в 2004 году и стала частью платформы Java EE 5 и Java SE 6.

История

Разработка JSR-173 началась в 2002 году под руководством компании BEA Systems (впоследствии приобретена Oracle Corporation). Основной целью было создание унифицированного, стандартизированного API для потоковой обработки XML, который сочетал бы производительность SAX и удобство работы с курсорами, характерное для DOM. До появления JSR-173 существовало несколько несовместимых реализаций StAX, включая BEA StAX, Apache Axiom и другие. Спецификация была завершена и выпущена как финальная версия (Final Release) в марте 2004 года. Впоследствии она была включена в состав Java Web Services Developer Pack (JWSDP) и вошла в стандартную библиотеку Java, начиная с версии Java SE 6 (в пакете javax.xml.stream).

Основные концепции

JSR-173 определяет два основных подхода к обработке XML: курсорный API (Cursor API) и итераторный API (Iterator API). Оба подхода основаны на последовательном чтении событий XML-парсера.

Курсорный API (Cursor API)

Курсорный API, представленный интерфейсами XMLStreamReader и XMLStreamWriter, предоставляет прямой доступ к потоку XML-событий. Разработчик вручную перемещает курсор по событиям (например, начало элемента, конец элемента, текст, комментарий) и извлекает данные. Этот подход обеспечивает максимальную производительность и минимальные накладные расходы, так как не требует создания промежуточных объектов для каждого события.

Итераторный API (Iterator API)

Итераторный API, представленный интерфейсами XMLEventReader и XMLEventWriter, использует модель событий, где каждое событие XML представлено объектом, реализующим интерфейс XMLEvent. Разработчик получает итератор по этим объектам, что позволяет более гибко обрабатывать события, например, сохранять их в списке для последующей обработки или модифицировать поток. Этот подход удобнее для сложных сценариев, но менее производителен, чем курсорный.

Архитектура и компоненты

Спецификация JSR-173 включает несколько ключевых компонентов:

  • XMLInputFactoryфабрика для создания экземпляров XMLStreamReader и XMLEventReader. Позволяет настраивать параметры парсера, такие как проверка корректности (validation), поддержка пространств имен (namespace), обработка сущностей и другие.
  • XMLOutputFactory — фабрика для создания экземпляров XMLStreamWriter и XMLEventWriter. Позволяет настраивать параметры записи, такие как кодировка, отступы (indentation) и автоматическое закрытие элементов.
  • XMLStreamReader — интерфейс для курсорного чтения XML. Предоставляет методы для получения типа текущего события (getEventType()), имени элемента (getLocalName(), getNamespaceURI()), атрибутов, текстового содержимого и т.д.
  • XMLStreamWriter — интерфейс для курсорной записи XML. Предоставляет методы для записи элементов (writeStartElement(), writeEndElement()), атрибутов, комментариев, CDATA и т.д.
  • XMLEventReader — интерфейс для итераторного чтения XML. Возвращает объекты XMLEvent, которые могут быть приведены к конкретным типам событий (например, StartElement, EndElement, Characters).
  • XMLEventWriter — интерфейс для итераторной записи XML. Принимает объекты XMLEvent и записывает их в выходной поток.
  • XMLEvent — базовый интерфейс для всех типов событий XML. Конкретные реализации включают StartElement, EndElement, Characters, Comment, ProcessingInstruction, EntityReference, DTD, Space и другие.

Применение

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

  • Обработка больших XML-документов — StAX позволяет обрабатывать документы, которые не помещаются в оперативную память целиком, так как чтение происходит потоково.
  • Создание веб-сервисов — JSR-173 является основой для реализации SOAP-сообщений в таких фреймворках, как JAX-WS (Java API for XML Web Services).
  • Трансформация XML — StAX используется в связке с XSLT или другими инструментами для преобразования XML-документов.
  • Интеграция с другими API — JSR-173 интегрируется с JAXB (Java Architecture for XML Binding) для сериализации и десериализации Java-объектов в XML и обратно.
  • Разработка парсеров и генераторов XML — на основе StAX строятся специализированные библиотеки и инструменты.

Реализации

Существует несколько реализаций JSR-173, как встроенных в среду выполнения Java, так и сторонних:

  • Reference Implementation (RI) — эталонная реализация, поставляемая в составе Java SE (начиная с версии 6) в пакете com.sun.xml.stream (в более поздних версиях — com.sun.xml.internal.stream).
  • Woodstox — высокопроизводительная реализация с открытым исходным кодом, часто используемая в проектах, требующих максимальной производительности.
  • Aalto — реализация, ориентированная на минимальное потребление памяти и асинхронную обработку.
  • Apache Xerces — реализация, входящая в состав популярного парсера XML от Apache Software Foundation.

Критика и ограничения

Несмотря на широкое распространение, JSR-173 имеет некоторые недостатки:

  • Сложность курсорного API — для разработчиков, привыкших к DOM или SAX, курсорный API может показаться неинтуитивным и требующим большего объема кода для простых операций.
  • Отсутствие поддержки XPath — StAX не предоставляет встроенной поддержки XPath-запросов, что требует использования дополнительных библиотек.
  • Ограниченная поддержка проверки корректности — хотя фабрика XMLInputFactory позволяет включать проверку, она не так гибка, как в SAX или DOM.
  • Устаревание в контексте современных форматов — с ростом популярности JSON и других форматов данных, использование XML в целом сокращается, что снижает актуальность JSR-173 для новых проектов.

Связь с другими спецификациями

JSR-173 тесно связан с другими спецификациями Java для обработки XML:

  • JSR-206 (Java API for XML Processing, JAXP) — JAXP включает SAX, DOM и StAX, предоставляя единую точку входа для различных парсеров.
  • JSR-222 (Java Architecture for XML Binding, JAXB) — JAXB использует StAX для потоковой сериализации и десериализации.
  • JSR-224 (Java API for XML Web Services, JAX-WS) — JAX-WS использует StAX для обработки SOAP-сообщений.

Источники

  • Java Community Process. JSR 173: Streaming API for XML (StAX). Final Release, 2004.
  • Oracle Corporation. Java Platform, Standard Edition 6 API Specification. Пакет javax.xml.stream.
  • Woodstox Project. Woodstox StAX Implementation. Документация.
  • Apache Software Foundation. Apache Xerces2 Java Parser. Документация.
  • Deitel, P. J., & Deitel, H. M. (2007). Java How to Program (7th ed.). Prentice Hall.

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

На главную BFOmetr →