Spec-Zone.ru › OpenJDK 24

Интерфейс 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
См. также:
  • XMLReader
  • DTDHandler
  • ErrorHandler

Краткое описание методов

Модификатор и тип Метод Описание
void characters(char[] ch, int start, int length)
Получение уведомления о символьных данных.
default void declaration(String version, String encoding, String standalone)
Получает уведомление об XML-декларации.
void endDocument()
Получение уведомления о завершении документа.
void endElement(String uri, String localName, String qName)
Получение уведомления о завершении элемента.
void endPrefixMapping(String prefix)
Завершение области сопоставления префикс-URI.
void ignorableWhitespace(char[] ch, int start, int length)
Получение уведомления о пренебрежимом пробеле в содержимом элемента.
void processingInstruction(String target, String data)
Получение уведомления об инструкции обработки.
void setDocumentLocator(Locator locator)
Получение объекта для определения источника событий SAX документа.
void skippedEntity(String name)
Получение уведомления о пропущенной сущности.
void startDocument()
Получение уведомления о начале документа.
void startElement(String uri, String localName, String qName, Attributes atts)
Получение уведомления о начале элемента.
void startPrefixMapping(String prefix, String uri)
Начало области сопоставления префикс-URI пространства имен.

Подробное описание методов

setDocumentLocator

void setDocumentLocator(Locator locator)
Получает объект для определения источника событий SAX документа.

SAX парсеры настоятельно рекомендуются (хотя и не являются абсолютно обязательными) для обеспечения локейтора: если он это делает, он должен предоставить локейтор приложению, вызвав этот метод перед вызовом любых других методов в интерфейсе ContentHandler.

Локейтор позволяет приложению определить конечную позицию любого события, связанного с документом, даже если парсер не сообщает об ошибке. Как правило, приложение будет использовать эту информацию для сообщения об собственных ошибках (например, содержимое символов, которое не соответствует бизнес-правилам приложения). Информация, возвращаемая локейтором, вероятно, не будет достаточной для использования с поисковой системой.

Обратите внимание, что локейтор будет возвращать правильную информацию только во время вызова обратных вызовов событий SAX после startDocument возвращает и перед тем, как endDocument будет вызван. Приложение не должно пытаться использовать его в любое другое время.

Параметры:
locator - объект, который может вернуть расположение любого события SAX документа
См. также:
  • Locator

startDocument

void startDocument() throws SAXException
Получает уведомление о начале документа.

SAX парсер вызовет этот метод только один раз, перед любыми другими обратными вызовами событий (кроме setDocumentLocator).

Исключения:
SAXException - любое исключение SAX, возможно, обертывающее другое исключение
См. также:
  • endDocument()

declaration

default void declaration(String version, String encoding, String standalone) throws SAXException
Получает уведомление об XML декларации.
Требования к реализации:
По умолчанию в SAX API ничего не делается.
Параметры:
version - строка версии, как в входном документе, null, если не указана
encoding - строка кодировки, как в входном документе, null, если не указана
standalone - строка standalone, как в входном документе, null, если не указана
Исключения:
SAXException - если приложение хочет сообщить об ошибке или прервать процесс парсинга
С:
14

endDocument

void endDocument() throws SAXException
Получает уведомление об окончании документа.

Этот метод вызывается парсером для сигнализации о достижении конца документа после успешного завершения процесса парсинга. После события парсер вернет управление приложению.

Примечание API:
В случае фатальной ошибки парсер может выбрать остановку процесса парсинга с SAXException, в этом случае этот метод никогда не будет вызван. Обратитесь к ErrorHandler.fatalError(org.xml.sax.SAXParseException).
Исключения:
SAXException - любое исключение SAX, возможно, обертывающее другое исключение
См. также:
  • startDocument()

startPrefixMapping

void startPrefixMapping(String prefix, String uri) throws SAXException
Начало области сопоставления имени-префикса URI.

Информация из этого события не нужна для нормальной обработки пространства имен: 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(java.lang.String)
  • startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

endPrefixMapping

void endPrefixMapping(String prefix) throws SAXException
Завершение области сопоставления имени-префикса URI.

См. startPrefixMapping для получения подробной информации. Эти события всегда будут происходить непосредственно после соответствующего события endElement, но порядок событий endPrefixMapping не гарантируется иначе.

Параметры:
prefix - префикс, который сопоставлялся. Это пустая строка, когда область сопоставления по умолчанию заканчивается.
Исключения:
SAXException - клиент может бросить исключение во время обработки
См. также:
  • startPrefixMapping(java.lang.String, java.lang.String)
  • endElement(java.lang.String, java.lang.String, java.lang.String)

startElement

void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException
Получает уведомление о начале элемента.

Парсер вызовет этот метод в начале каждого элемента в XML документе; будет соответствующее событие endElement для каждого события startElement (даже когда элемент пустой). Все содержимое элемента будет сообщено в порядке, прежде чем соответствующее событие endElement.

Это событие допускает до трёх компонентов имени для каждого элемента:

  1. URI пространства имён;
  2. локальное имя; и
  3. полное (с префиксом) имя.

Любые или все из них могут быть предоставлены, в зависимости от значений свойств 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(java.lang.String, java.lang.String, java.lang.String)
  • Attributes
  • AttributesImpl

Конец элемента

void endElement(String uri, String localName, String qName) throws SAXException
Получение уведомления о конце элемента.

Парсер SAX вызовет этот метод в конце каждого элемента в документе XML; для каждого события endElement будет соответствующее событие startElement (даже когда элемент пуст).

Сведения о именах см. в 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(char[], int, int)
  • Locator

ignorableWhitespace

void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
Получение уведомления о пропускаемых пробелах в содержимом элемента.

Валидирующие парсеры должны использовать этот метод для отчётности о каждом фрагменте пробелов в содержимом элемента (см. рекомендацию W3C XML 1.0, раздел 2.10): невалидирующие парсеры также могут использовать этот метод, если они способны анализировать и использовать модели содержимого.

Парсеры SAX могут возвращать все смежные пробелы в одном фрагменте или разбивать их на несколько фрагментов; однако все символы в любом отдельном событии должны поступать из одной и той же внешней сущности, чтобы локатор предоставлял полезную информацию.

Приложение не должно пытаться читать из массива за пределами указанного диапазона.

Параметры:
ch - символы из документа XML
start - начальная позиция в массиве
length - количество символов для чтения из массива
Исключения:
SAXException - любое исключение SAX, возможно, обертывающее другое исключение
См. также:
  • characters(char[], int, int)

Обработка инструкции

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
Получение уведомления о пропущенной сущности. Это не вызывается для ссылок на сущности внутри конструкций разметки, таких как начальные теги элементов или декларации разметки. (Рекомендация XML требует отчёта о пропущенных внешних сущностях. SAX также сообщает о расширении/не расширении внутренней сущности, за исключением конструкций разметки.)

Парсер вызовет этот метод каждый раз, когда сущность будет пропущена. Невалидирующие процессоры могут пропускать сущности, если они не видели декларации (например, потому, что сущность была объявлена во внешнем подмножестве 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://download.java.net/java/early_access/jdk24/docs/api/java.xml/org/xml/sax/ContentHandler.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API