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

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

public void warning(SAXParserException ex); public void error(SAXParserException ex); public void fatalError(SAXParserException ex);

Класс DefaultHandler делает пустую реализацию этого интерфейса. При расширении данного класса можно сделать реализацию одного или всех методов интерфейса ErrorHandler. Пример такой реализации приведен в листинге 28.9. Класс SAXParserException хранит номер строки и столбца проверяемого документа, в котором замечена ошибка. Их можно получить методами getLineNumber( ) и getColumnNumber ( ), как сделано в листинге 28.9.

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

Интерфейсы и классы StAX собраны в пакеты javax.xml.stream, javax.xml.stream.events, javax.xml. stream.util, но на практике достаточно применения только нескольких интерфейсов и классов.

Основные методы разбора документа описаны в интерфейсе XMLStreamReader. Разбор заключается в том, что парсер просматривает документ, переходя от элемента к элементу и от одной части элемента к другой методом next (). Метод next () возвращает одну из целочисленных констант, описанных в интерфейсе XMLStreamConstants, показывающих тип той части документа, в которой находится парсер: start_document, start_element, END_ELEMENT, CHARACTERS и т. д. В зависимости от этого типа интерфейс XMLStreamReader предоставляет те или иные методы обработки документа. Так, если парсер находится в открывающем теге элемента, start_element, то мы можем получить короткое имя элемента методом getLocalName ( ), число атрибутов методом getAttributeCount(), имя и значение k-го атрибута методами getAttributeName(k) и getAttributeValue(k). Если парсер находится в теле элемента, characters, можно получить содержимое тела методом

getText().

Программа следующего листинга 28.10 выполняет средствами StAX ту же работу, что и программа, записанная в листинге 28.9.

Листинг 28.10. Класс-обработчик документа XML средствами StAX

import javax.xml.stream.*; import java.util.*; import j ava.io.*;

public class NotebookHandlerStAX implements XMLStreamConstants{ private Person person; private Address address;

private static Vector<Person> pers = new Vector<>(); boolean inBirthday, inStreet, inCity, inZip,

inWorkPhone, inHomePhone;

private void processElement(XMLStreamReader element) throws XMLStreamException{ switch (element.getLocalName()){ case "name": person = new Person(element.getAttributeValue(0), element.getAttributeValue(1), element.getAttributeValue(2)); break; case "birthday": inBirthday = true; break; case "address": address = new Address(); break; case "street": inStreet = true; break; case "city": inCity = true; break; case "zip": inZip = true; break; case "work-phone": inWorkPhone = true; break; case "home-phone": inHomePhone = true; break;