Spec-Zone .ru
спецификации, руководства, описания, API
След: API Java для XML, Обрабатывающего (JAXP)
Урок: Простой API для XML
Обработка Лексических Событий
Домашняя страница > API Java для XML, Обрабатывающего (JAXP) > Простой API для XML

Обработка Лексических Событий

В этой точке Вы переварили много понятий XML, включая DTD и внешние объекты. Вы также изучили свой путь вокруг синтаксического анализатора SAX. Остаток от этого урока затрагивает усовершенствованные темы, которые Вы должны будете понять, только если Вы пишете основанные на SAX приложения. Если Ваша основная цель состоит в том, чтобы записать DOM-на-основе приложения, можно пропустить к Объектной модели документа.

Вы видели ранее, что, если Вы выписываете текст как XML, Вы должны знать, являетесь ли Вы в разделе CDATA. Если Вы, то угловые скобки (<) и амперсанды (&) должны быть выведены неизменные. Но если Вы не находитесь в разделе CDATA, они должны быть заменены предопределенными объектами &lt; и &amp;. Но как Вы знаете, обрабатываете ли Вы раздел CDATA?

С другой стороны, если Вы фильтруете XML в некотором роде, Вы хотите провести комментарии. Обычно синтаксический анализатор игнорирует комментарии. Как можно получить комментарии так, чтобы можно было повторить их?

Этот раздел отвечает на те вопросы. Это показывает Вам, как использовать org.xml.sax.ext.LexicalHandler, чтобы идентифицировать комментарии, разделы CDATA, и ссылки на проанализированные объекты.

Комментарии, теги CDATA, и ссылки на проанализированные объекты составляют лексическую информацию - то есть, информация, которая касается текста XML непосредственно, а не информационного контента XML. Большинство приложений, конечно, затрагивается только с контентом XML-документа. Такие приложения не будут использовать API LexicalEventListener. Но приложения, которые выводят текст XML, сочтут это неоценимым.


Отметьте - Лексическая обработка событий является дополнительной функцией синтаксического анализатора. Реализации синтаксического анализатора не обязаны поддерживать это. (Ссылочная реализация делает так.) Это обсуждение предполагает, что Ваш синтаксический анализатор делает так.


Как LexicalHandler Работает

Чтобы быть информированными, когда синтаксический анализатор SAX видит лексическую информацию, Вы конфигурируете XmlReader, который лежит в основе синтаксического анализатора с LexicalHandler. Интерфейс LexicalHandler определяет следующие методы обработки событий.

comment(String comment)

Передачи комментируют к приложению.

startCDATA(), endCDATA()

Говорит, когда раздел CDATA запускается и заканчивается, который говорит Ваше приложение, какие символы, чтобы ожидать в следующий раз characters() вызывают.

startEntity(String name), endEntity(String name)

Дает имя проанализированного объекта.

startDTD(String name, String publicId, String systemId), endDTD()

Говорит, когда DTD обрабатывается, и идентифицирует это.

Чтобы активировать Лексический Обработчик, Ваше приложение должно расширить DefaultHandler и реализовать интерфейс LexicalHandler. Затем, следует сконфигурировать свой экземпляр XMLReader, что делегаты синтаксического анализатора в, и конфигурируют его, чтобы отправить лексические события Вашему лексическому обработчику, как показано ниже.

// ...

SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",
                      handler); 
// ...

Здесь, Вы конфигурируете XMLReader, используя метод setProperty(), определенный в XMLReader class. Именем свойства, определенным как часть стандарта SAX, является УРНА, http://xml.org/sax/properties/lexical-handler.

Наконец, добавьте что-то как следующий код, чтобы определить соответствующие методы, которые реализуют интерфейс.

// ...

public void warning(SAXParseException err) {
    // ...
}

public void comment(char[] ch, int start, int length) throws SAXException {
    // ...   
}

public void startCDATA() throws SAXException {
    // ...
}

pubic void endCDATA() throws SAXException {
    // ...
}

public void startEntity(String name) throws SAXException {
    // ...
}

public void endEntity(String name) throws SAXException {
    // ...
}

public void startDTD(String name, String publicId, String systemId)
    throws SAXException {
    // ...
}

public void endDTD() throws SAXException {
    // ...
}

private void echoText() {
    // ...
}

// ...

Этот код преобразует Ваше приложение парсинга в лексический обработчик. Все, что остается быть сделанным, должно дать каждый из этих новых методов действие, чтобы выполнить.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Реализация Проверки допустимости SAX
Следующая страница: Используя DTDHandler и EntityResolver