Интерфейс 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
- Требования к реализации:
- По умолчанию в 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, возможно, обертывающее другое исключение - См. также:
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 события, но их порядок не гарантируется.
Для префикса "xml" никогда не должно быть событий start/endPrefixMapping, так как он предопределён и неизменяем.
- Параметры:
-
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 могут возвращать все непрерывные данные символов в одном блоке или разбить их на несколько блоков; однако все символы в любом отдельном событии должны быть взяты из одного и того же внешнего сущности, чтобы локализатор предоставлял полезную информацию.
Приложение не должно пытаться читать массив за пределами указанного диапазона.
Отдельные символы могут состоять из более чем одного значения 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, возможно, обертывающее другое исключение - См. также:
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, 2021, 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/17/docs/api/java.xml/org/xml/sax/ContentHandler.html