Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 472

Ильдар Шаукатович Хабибуллин

Третью группу образуют потоковые парсеры (stream parsers), которые так же, как и парсеры второй группы, просматривают документ, переходя от элемента к элементу. При каждом переходе парсер предоставляет программе методы getName ( ), getText ( ),

getAttributeName (), getAttributeValue() и т. д., позволяющие обработать текущий элемент.

В стандартную поставку Java и Standard Edition и Enterprise Edition входит набор интерфейсов и классов для создания парсеров и преобразования документов XML, называемый JAXP (Java API for XML Processing). С помощью одной из частей этого набора, называемой DOM API (Document Object Model API), можно создавать парсеры первого типа, формирующие дерево объектов. С помощью второй части набора JAXP, называемой SAX API, можно создавать SAX-парсеры. Третья часть JAXP, предназначенная для создания потоковых парсеров, называется StAX (Streaming API for XML).

Анализ документов XML с помощью SAX2

Интерфейсы и классы SAX2 собраны в пакеты org.xml.sax, org.xml.sax.ext,

org.xml.sax.helpers, javax.xml.parsers. Рассмотрим их подробнее.

Основу SAX2 составляет интерфейс org.xml.sax.ContentHandler, описывающий методы обработки событий: начала документа, появления открывающего тега, появление тела элемента, появление закрывающего тега, окончание документа. При возникновении такого события SAX2 обращается к методу-обработчику события, передавая ему аргументы, содержащие информацию о событии. Дело разработчика — реализовать эти методы, обеспечив правильный анализ документа.

В начале обработки документа вызывается метод

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

При появлении символа "<", начинающего открывающий тег, вызывается метод

public void startElement(String uri, String name,

String qname, Attributes attrs);

В метод передаются три имени, два из которых связаны с пространством имен: идентификатор пространства имен uri, локальное имя тега без префикса name и расширенное имя с префиксом qname, а также атрибуты открывающего тега элемента attrs, если они есть. Если пространство имен не определено, то значения первого и второго аргументов равны null. Если нет атрибутов, то передается ссылка на пустой объект attrs.

При появлении символов "</", начинающих закрывающий тег, вызывается метод

public void endElement(String uri, String name, String qname);

При появлении строки символов вызывается метод

public void characters(char[] ch, int start, int length);

В него передается массив символов ch, индекс начала строки символов start в этом массиве и количество символов length.