Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-06.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
287.23 Кб
Скачать

5.2.2. СинтаксическиеSax-анализаторыXml

Простой интерфейс прикладного программирования (API) дляXML–SAX(SimpleAPIforXML) – это основанный на событиях интерфейс, предназначенный для анализаторов XML. (точнее сказать, это наборAPI). Первая спецификацияSAX–SAX1.0, была разработана в 1999 году. В настоящее время разработана новая спецификация SAX 2.0.

Событием в SAXназывается появление при просмотре документаXMLэлемента разметки, т.е. открывающего или закрывающего элемента, комментария и т.п. При этом вызываются определенные программистом для каждого события методы, т.е. интерфейсSAXпреобразует анализ документаXMLв вызов определенно­го метода (типа события) с соответствующими параметрами (которые описывают состояние события).

В принципе, SAX-анализаторы и процессорыXMLможно реализовать на любом языке программирования, однако наиболее просто такое программирование выполняется на языкеJava. В составJavaJ2SEиJ2EEвходят пакетыorg.xml.sax,org.xml.sax.ext,org.xml.sax.helpersиjavax.xml.parsersдля разработкиSAX-анализаторов по спецификации 2.0 (SAX2).

Более сложным и вместе с тем более мощным средством является обработка документа XML с использованием средств объектной модели документа – DOM (DocumentObjectModel), реализованной в языкеJava.

5.2.3. РеализацияDomxmLв языкеJava

5.2.3.1. Доступ к документу xml

Средства реализации DOM-анализаторов на языкеJavaопределены в классахDocumentBuilderиDocumentBuilderFactoryпакетаjavax.xml.parsers.

5.2.3.1.1. Класс DocumentBuilder

Абстрактный класс DocumentBuilderопределяет интерфейс прикладного программирования –API(ApplicationProgramInterface) для получения экземпляров объектаDocumentиз документаXML.

Основными методами класса DocumentBuilderявляются методы анализа документаXML:

public Document parse(File f) throws SAXException,

IOException

public abstract Document parse(InputSource is)

throws SAXException, IOException

public Document parse(InputStream is)

throws SAXException, IOException

public Document parse(InputStream is, String systemId)

throws SAXException, IOException

public Document parse(String uri) throws SAXException,

IOException

В параметре метода задается источник, в котором содержится документ, представленный как экземпляр одного из классов: File,InputSourceилиInputStream, либо как обращение к ресурсуURI. Параметр вsystemIdчетвертом методе задает системный идентификатор, необходимый для разрешения относительныхURI.

Получение экземпляра объекта DocumentдляDOM-анализатора выполняется с помощью одного из методов:

public abstract Document newDocument()

public abstract DOMImplementation getDOMImplementation()

Первый метод прямо получает новый экземпляр объекта Documentдля построения дереваDOM. Второй метод получает объектDOMImplementation, а затем с помощью методовDOMуровня 2 создается новый объектDocument.

Метод

public abstract void setErrorHandler(ErrorHandler eh)

позволяет установить обработчик ошибок для документа XML.

В интерфейсе ErrorHandlerпакетаorg.xml.saxопределены следующие методы обработки ошибок:

public void fatalError(SAXParseException exception)

throws SAXException

public void error(SAXParseException exception)

throws SAXException

public void warning(SAXParseException exception)

throws SAXException,

Эти методы обеспечивают получение уведомлений о фатальной ошибке, восстановимой ошибке и предупреждении.

Методы интерфейса ErrorHandlerреализованыв классеDefaultHandler. Все эти методы просто бросают исключениеSAXParseException. Если необходимо выполнить собственную обработку ошибок, методы обработки ошибок следует переписать в классе, расширяющем класс DefaultHandler.

Пример реализации собственного метода fatalError() в классе DefaultHandler документа email.xml:

public void fatalError(SAXParseException spe)

throws SAXParseException {

System.out.println(spe.getMessage() +

" в строке " + spe.getLineNumber());

System.exit(1);

}

Если в методе startElement()после оператораifдля проверки элементаbodyвставить следующий фрагмент

else {

fatalError(new SAXParseException(

"Недопустимый дескриптор <" + qname +

">", locator)

);

}

то, при появлении в тексте документа недопустимого дескриптора, например, <Header>, будет выведено сообщение

Недопустимый дескриптор <header> в строке 11

Метод

public abstract void setEntityResolver(EntityResolver er)

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

Единственный метод

public InputSource resolveEntity(String publicId,

String systemId) throws SAXException, IOException

интерфейса EntityResolver в пакете org.xml.sax позволяет предложению обрабатывать ссылки на внешние сущности. ИнтерфейсEntityResolverреализован в классеDefaultHandler. МетодresolveEntity(), реализованный в этом классе, всегда возвращаетnull. В подклассе классаDefaultHandlerможно переопределить методresolveEntity()для конкретного приложения.

Пример реализации метода resolveEntity() для разрешения внешних ссылок в документе email.xml:

public InputSource resolveEntity(String publicId,

String systemId) throws SAXException {

InputSource entitySource = null;

if (systemId.startsWith("file:"))

systemId = systemId.substring(5);

try {

entitySource =

new InputSource(new FileInputStream(systemId));

}

catch(IOException ioe) {

System.out.println("Ошибка в файле <" +

systemId + ">");

}

return entitySource;

}

С помощью методов

public abstract boolean isNamespaceAware()

public abstract boolean isValidating()

выполняется проверка, сконфигурирован ли данный DOM-анализатор для работы с пространствами имен или для проверки действительности документаXML.

Соседние файлы в папке Лекции