Интерфейс ContentHandler
- Все известные подинтерфейсы:
TemplatesHandler, TransformerHandler
- Все известные реализующие классы:
DefaultHandler, DefaultHandler2, ValidatorHandler, XMLFilterImpl, XMLReaderAdapter
public interface ContentHandler
Это основной интерфейс, который реализует большинство приложений SAX: если приложению необходимо получать уведомления об основных событиях разбора, оно реализует этот интерфейс и регистрирует его экземпляр в анализаторе SAX с помощью метода setContentHandler. Анализатор использует этот экземпляр для передачи основных событий, связанных с документом, например начала и конца элементов и символьных данных.
Порядок событий в этом интерфейсе очень важен и повторяет порядок информации в самом документе. Например, всё содержимое элемента (символьные данные, инструкции обработки и/или вложенные элементы) будет последовательно передаваться между событием startElement и соответствующим событием endElement.
Этот интерфейс похож на устаревший интерфейс DocumentHandler из SAX 1.0, но поддерживает пространства имён и передачу сведений о пропущенных сущностях (в XML-процессорах без проверки корректности).
Разработчикам следует учитывать, что в пакете java.net также есть класс ContentHandler; это означает, что, вероятно, не стоит делать следующее:
import java.net.*; import org.xml.sax.*;
На самом деле конструкция «import ...*» обычно и без того свидетельствует о небрежном программировании, поэтому пользователю следует считать это особенностью, а не ошибкой.
- Начиная с версии:
- 1.4, SAX 2.0
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
characters |
Получает уведомление о символьных данных. |
default void |
declaration |
Получает уведомление об XML-декларации. |
void |
endDocument() |
Получает уведомление о завершении документа. |
void |
endElement |
Получает уведомление о завершении элемента. |
void |
endPrefixMapping |
Завершает область действия сопоставления префикса с URI. |
void |
ignorableWhitespace |
Получает уведомление о незначащих пробельных символах в содержимом элемента. |
void |
processingInstruction |
Получает уведомление об инструкции обработки. |
void |
setDocumentLocator |
Получает объект, позволяющий определить источник событий документа SAX. |
void |
skippedEntity |
Получает уведомление о пропущенной сущности. |
void |
startDocument() |
Получает уведомление о начале документа. |
void |
startElement |
Получает уведомление о начале элемента. |
void |
startPrefixMapping |
Начинает область действия сопоставления пространства имён «префикс–URI». |
Подробное описание методов
setDocumentLocator
void setDocumentLocator(Locator locator)
Настоятельно рекомендуется, хотя и не является обязательным, чтобы анализаторы SAX предоставляли локатор. Если анализатор это делает, он должен передать локатор приложению, вызвав этот метод до вызова любых других методов интерфейса ContentHandler.
Локатор позволяет приложению определить конечную позицию любого события, связанного с документом, даже если анализатор не сообщает об ошибке. Обычно приложение использует эту информацию для сообщения о собственных ошибках (например, если символьное содержимое не соответствует бизнес-правилам приложения). Информация, возвращаемая локатором, вероятно, недостаточна для использования поисковой системой.
Обратите внимание: локатор возвращает правильную информацию только во время обратных вызовов обработчиков событий SAX после возврата из startDocument и до вызова endDocument. Приложению не следует использовать его в любое другое время.
- Параметры:
-
locator— объект, который может возвращать местоположение любого события документа SAX - См. также:
startDocument
void startDocument() throws SAXException
Анализатор SAX вызывает этот метод только один раз, перед любыми другими обратными вызовами обработчиков событий (за исключением setDocumentLocator).
- Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение - См. также:
declaration
default void declaration(String version, String encoding, String standalone) throws SAXException
- Требования к реализации:
- Реализация по умолчанию в API SAX ничего не делает.
- Параметры:
-
version— строка версии из входного документа; null, если она не указана -
encoding— строка кодировки из входного документа; null, если она не указана -
standalone— строка standalone из входного документа; null, если она не указана - Исключения:
-
SAXException— если приложение хочет сообщить об ошибке или прервать процесс разбора - Начиная с версии:
- 14
endDocument
void endDocument() throws SAXException
Этот метод вызывается анализатором, чтобы сообщить о достижении конца документа после успешного завершения процесса разбора. После этого события анализатор передаёт управление приложению.
- Примечание к API:
- В случае неисправимой ошибки анализатор может остановить процесс разбора, выбросив
SAXException; в таком случае этот метод вызван не будет. См.ErrorHandler.fatalError(org.xml.sax.SAXParseException). - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение - См. также:
startPrefixMapping
void startPrefixMapping(String prefix, String uri) throws SAXException
Информация из этого события не требуется для обычной обработки пространств имён: XML-считыватель SAX автоматически заменяет префиксы в именах элементов и атрибутов, когда функция http://xml.org/sax/features/namespaces имеет значение true (по умолчанию).
Однако иногда приложениям необходимо использовать префиксы в символьных данных или значениях атрибутов, где их нельзя безопасно раскрыть автоматически; событие start/endPrefixMapping предоставляет приложению информацию, необходимую для самостоятельного раскрытия префиксов в этих контекстах, если это требуется.
Обратите внимание: события start/endPrefixMapping не обязательно должны быть правильно вложены относительно друг друга: все события startPrefixMapping происходят непосредственно перед соответствующим событием startElement, а все события endPrefixMapping — непосредственно после соответствующего события endElement, но в остальном порядок этих событий не гарантируется.
События start/endPrefixMapping для префикса «xml» возникать не должны, поскольку он предварительно объявлен и неизменяем.
- Параметры:
-
prefix— объявляемый префикс пространства имён. Для пространства имён элемента по умолчанию, у которого нет префикса, используется пустая строка. -
uri— URI пространства имён, которому сопоставлен префикс - Исключения:
-
SAXException— клиент может выбросить исключение во время обработки - См. также:
endPrefixMapping
void endPrefixMapping(String prefix) throws SAXException
Подробности см. в описании startPrefixMapping. Эти события всегда происходят непосредственно после соответствующего события endElement, однако порядок событий endPrefixMapping в остальном не гарантируется.
- Параметры:
-
prefix— префикс, сопоставление для которого завершено. При завершении области действия сопоставления по умолчанию используется пустая строка. - Исключения:
-
SAXException— клиент может выбросить исключение во время обработки - См. также:
startElement
void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException
Анализатор вызывает этот метод в начале каждого элемента XML-документа; каждому событию startElement соответствует событие endElement (даже если элемент пуст). Всё содержимое элемента будет передано по порядку до соответствующего события endElement.
Это событие может содержать до трёх компонентов имени каждого элемента:
- URI пространства имён;
- локальное имя; и
- полное имя (с префиксом).
В зависимости от значений свойств http://xml.org/sax/features/namespaces и http://xml.org/sax/features/namespace-prefixes могут быть предоставлены все или некоторые из этих компонентов:
- URI пространства имён и локальное имя обязательны, если свойство namespaces имеет значение true (по умолчанию), и необязательны, если свойство namespaces имеет значение false (если указано одно из них, должны быть указаны оба);
- полное имя обязательно, если свойство namespace-prefixes имеет значение true, и необязательно, если свойство namespace-prefixes имеет значение false (по умолчанию).
Обратите внимание: передаваемый список атрибутов будет содержать только атрибуты с явными значениями (указанными или заданными по умолчанию); атрибуты #IMPLIED будут опущены. Список атрибутов будет содержать атрибуты, используемые для объявлений пространств имён (атрибуты xmlns*), только если свойство http://xml.org/sax/features/namespace-prefixes имеет значение true (по умолчанию оно равно false; поддержка значения true необязательна).
Как и в случае с characters(), значения атрибутов могут содержать символы, для представления которых требуется более одного значения char.
- Параметры:
-
uri— URI пространства имён или пустая строка, если у элемента нет URI пространства имён либо обработка пространств имён не выполняется -
localName— локальное имя (без префикса) или пустая строка, если обработка пространств имён не выполняется -
qName— полное имя (с префиксом) или пустая строка, если полные имена недоступны -
atts— атрибуты элемента. Если атрибутов нет, должен использоваться пустой объект Attributes. Значение этого объекта после возврата из startElement не определено - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение - См. также:
endElement
void endElement(String uri, String localName, String qName) throws SAXException
Анализатор SAX вызывает этот метод в конце каждого элемента XML-документа; каждому событию endElement соответствует событие startElement (даже если элемент пуст).
Сведения об именах см. в описании startElement.
- Параметры:
-
uri— URI пространства имён или пустая строка, если у элемента нет URI пространства имён либо обработка пространств имён не выполняется -
localName— локальное имя (без префикса) или пустая строка, если обработка пространств имён не выполняется -
qName— полное имя XML (с префиксом) или пустая строка, если полные имена недоступны - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение
characters
void characters(char[] ch, int start, int length) throws SAXException
Анализатор вызывает этот метод для передачи каждого фрагмента символьных данных. Анализаторы SAX могут вернуть все непрерывные символьные данные одним фрагментом или разделить их на несколько фрагментов; однако все символы в одном событии должны происходить из одной и той же внешней сущности, чтобы локатор предоставлял полезную информацию.
Приложение не должно пытаться считывать данные из массива за пределами указанного диапазона.
Для представления отдельных символов может потребоваться более одного значения char в Java. Есть два важных случая, когда это происходит, поскольку символы нельзя представить всего шестнадцатью битами. В одном случае символы представлены суррогатной парой с использованием двух специальных значений Unicode. Такие символы находятся в так называемых «астральных плоскостях» и имеют кодовую точку выше U+FFFF. Второй случай связан с составными символами, например базовым символом, объединённым с одним или несколькими диакритическими знаками.
Ваш код не должен предполагать, что алгоритмы, использующие идиомы обработки по одному char, работают с единицами символов; в некоторых случаях они будут разделять символы. Это важно везде, где XML допускает произвольные символы, например в значениях атрибутов, данных инструкций обработки и комментариях, а также в данных, передаваемых этим методом. Обычно это важно и при обработке интернационализированного текста в коде Java; проблема характерна не только для XML.
Обратите внимание: некоторые анализаторы передают пробельные символы в содержимом элемента с помощью метода ignorableWhitespace, а не этого метода (проверяющие корректность анализаторы обязаны так делать).
- Параметры:
-
ch— символы из XML-документа -
start— начальная позиция в массиве -
length— количество символов для чтения из массива - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение - См. также:
ignorableWhitespace
void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
Проверяющие корректность анализаторы обязаны использовать этот метод для передачи каждого фрагмента пробельных символов в содержимом элемента (см. рекомендацию W3C XML 1.0, раздел 2.10); анализаторы без проверки корректности также могут использовать этот метод, если способны разбирать модели содержимого и применять их.
Анализаторы SAX могут вернуть все непрерывные пробельные символы одним фрагментом или разделить их на несколько фрагментов; однако все символы в одном событии должны происходить из одной и той же внешней сущности, чтобы локатор предоставлял полезную информацию.
Приложение не должно пытаться считывать данные из массива за пределами указанного диапазона.
- Параметры:
-
ch— символы из XML-документа -
start— начальная позиция в массиве -
length— количество символов для чтения из массива - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение - См. также:
processingInstruction
void processingInstruction(String target, String data) throws SAXException
Анализатор вызывает этот метод один раз для каждой найденной инструкции обработки: обратите внимание, что инструкции обработки могут находиться до или после основного элемента документа.
Анализатор SAX не должен передавать этим методом XML-декларацию (XML 1.0, раздел 2.8) или текстовую декларацию (XML 1.0, раздел 4.3.1).
Как и в случае с characters(), данные инструкции обработки могут содержать символы, для представления которых требуется более одного значения char.
- Параметры:
-
target— цель инструкции обработки -
data— данные инструкции обработки или null, если они не заданы. Данные не включают пробельные символы, отделяющие их от цели - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение
skippedEntity
void skippedEntity(String name) throws SAXException
Анализатор вызывает этот метод каждый раз, когда сущность пропускается. Процессоры без проверки корректности могут пропускать сущности, если им неизвестны объявления (например, если сущность объявлена во внешнем подмножестве DTD). Все процессоры могут пропускать внешние сущности в зависимости от значений свойств http://xml.org/sax/features/external-general-entities и http://xml.org/sax/features/external-parameter-entities.
- Параметры:
-
name— имя пропущенной сущности. Если это параметрическая сущность, имя начинается с «%», а если это внешнее подмножество DTD, используется строка «[dtd]» - Исключения:
-
SAXException— любое исключение SAX, возможно, оборачивающее другое исключение
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.xml/org/xml/sax/ContentHandler.html