
- •Лекция 4-06
- •Тема 5.2. Обработка документов xml с использованием Java
- •Тема 5.2. Обработка документов xml с использованием Java
- •5.2.1. Обработка документов xml
- •5.2.2. СинтаксическиеSax-анализаторыXml
- •5.2.3. РеализацияDomxmLв языкеJava
- •5.2.3.1. Доступ к документу xml
- •5.2.3.1.1. Класс DocumentBuilder
- •5.2.3.1.2. КлассDocumentBuilderFactory
- •5.2.3.2. Интерфейсы dom xml в языкеJava
- •5.2.3.2.1. ИнтерфейсDomImplementation
- •5.2.3.2.2. ИнтерфейсNodeList
- •5.2.3.2.3. ИнтерфейсNamedNodeMap
- •5.2.3.2.4. ИнтерфейсNode
- •5.2.3.2.5. ИнтерфейсыDocument,DocumentFragmentиDocumentType
- •Тема 1: 'Поздравление'
- •5.2.3.2.6. ИнтерфейсElement
- •5.2.3.2.7. ИнтерфейсAttr
- •5.2.3.2.8. Интерфейсы CharacterData, Text, Comment и cdataSection
- •5.2.3.2.9. ИнтерфейсыEntity,EntityReference,NotationиProcessingInstruction
- •5.2.3.2.10. ИсключениеDomException
- •5.2.3.3. Средства выполнения преобразований документовXmLв языкеJava
- •5.2.3.3.1. Общие средства выполнения преобразований документовXml
- •5.2.3.3.2. Средства преобразования дляDom-анализатора
- •5.2.3.3.3. Средства преобразования для потоков ввода-вывода
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.