Интерфейс ContentHandler
- Все известные подинтерфейсы:
-
TemplatesHandler,TransformerHandler
- Все известные реализующие классы:
-
DefaultHandler,DefaultHandler2,ValidatorHandler,XMLFilterImpl,XMLReaderAdapter
public interface ContentHandler
Это основной интерфейс, который реализуют большинство приложений SAX: если приложение должно быть проинформировано о базовых событиях парсинга, оно реализует этот интерфейс и регистрирует экземпляр с парсером SAX с помощью метода setContentHandler. Парсер использует этот экземпляр для отчётности о базовых событиях, связанных с документом, таких как начало и конец элементов и текстовые данные.
Порядок событий в этом интерфейсе очень важен и отражает порядок информации в самом документе. Например, всё содержимое элемента (текстовые данные, инструкции обработки и/или подэлементы) появится в порядке следования между событием startElement и соответствующим событием endElement.
Этот интерфейс похож на теперь устаревший интерфейс DocumentHandler SAX 1.0, но он добавляет поддержку именованных пространств имён и отчётность о пропущенных сущностях (в невалидирующих процессорах XML).
Реализаторы должны учитывать, что также существует класс ContentHandler в пакете java.net; это означает, что, вероятно, не стоит
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
Информация из этого события не нужна для обычной обработки именования: SAX XML-ридер автоматически заменит префиксы для имен элементов и атрибутов, когда свойство 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-документе; будет соответствующее событие endElement для каждого события startElement (даже когда элемент пуст). Всё содержимое элемента будет сообщено в порядке, перед соответствующим событием 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-документе; будет соответствующее событие startElement для каждого события endElement (даже когда элемент пуст).
Для информации о именах, см. startElement.
- Параметры:
-
uri- URI пространства имен или пустая строка, если у элемента нет URI пространства имен или если обработка пространства имен не выполняется -
localName- локальное имя (без префикса) или пустая строка, если обработка пространства имен не выполняется -
qName- полное имя XML (с префиксом) или пустая строка, если полные имена недоступны - Исключения:
-
SAXException- любое исключение SAX, возможно, обертывающее другое исключение
Символы
void characters(char[] ch, int start, int length) throws SAXException
Парсер вызовет этот метод для отчёта о каждом фрагменте данных символов. Парсеры SAX могут возвращать все смежные данные символов в одном фрагменте, или могут разделить их на несколько фрагментов; однако, все символы в любом отдельном событии должны поступать из одного и того же внешнего сущности, чтобы локатор предоставлял полезную информацию.
Приложение не должно пытаться читать из массива за пределами указанного диапазона.
Отдельные символы могут состоять из более чем одного значения Java char . Существуют два важных случая, когда это происходит, потому что символы не могут быть представлены только шестнадцатью битами. В одном случае символы представлены в паре замещения, используя два специальных значения 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, возможно, обертывающее другое исключение - См. также:
обработкаИнструкции
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, возможно, обертывающее другое исключение
пропущеннаяСущность
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, 2023, 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/21/docs/api/java.xml/org/xml/sax/ContentHandler.html