
- •План лекции
- •У истоков
- •Наследники
- •Отличия XML от HTML
- •Пример XML
- •Структура XML-документа
- •Структура XML-документа
- •Некоторые инструкции
- •Правильный документ
- •Document Type Definition (DTD)
- •Регулярные выражения
- •Примеры выражений
- •Описание атрибутов: типы
- •Описание атрибутов: значения
- •Примеры выражений
- •XML Schema
- •Поддержка типов данных
- •XML Schema описывается на XML
- •Документ и тип DTD
- •XML Schema для документа
- •Указание типа документа
- •Extensible Stylesheet Language (XSL)
- •XPath
- •Примеры выражений XPath
- •Принципы XSL
- •Пример XML (catalog.xml)
- •Пример XSL (tranformation.xsl)
- •Результат трансформации
- •Обработка XML
- •Логика SAX
- •Логика DOM
- •Особенности SAX и DOM
- •Работа с XML в Java
- •Работа с SAX
- •Пакет javax.xml.parsers
- •Семантика документа
- •Создание обработчика событий
- •Пример. Файл XML
- •Пример. Часть 1
- •Пример. Часть 2
- •Пример. Часть 3
- •Пример. Часть 4
- •Пример. Результат
- •Работа с DOM
- •Пакет org.w3c.dom
- •Пакет javax.xml.parsers
- •Пример. Файл XML
- •Пример. Часть 1
- •Пример. Часть 2
- •Пример. Часть 3
- •Пример. Результат
- •Запись XML
- •Пример. Часть 1
- •Пример. Часть 2
- •Пример. Часть 3
- •Настройка преобразователя
- •Пример XSL-преобразования
- •Размышления на тему
- •Шаг 1. Сохранение JavaBeans
- •Пример. Часть 1
- •Пример. Часть 2
- •Шаг 2. Java Architecture for XML Binding (JAXB)
- •Пример. RootClass
- •Пример. NodeClass (1)
- •Пример. WriterJAXB
- •Содержимое файла после выполнения (1)
- •Пример. NodeClass (2)
- •Содержимое файла после выполнения (2)
- •Пакет javax.xml.bind.annotation
- •Пример. ReaderJAXB
- •Спасибо за внимание!
- •Дополнительные источники

Логика DOM
DOM
Tree
DOM
XML Document
Builder Error
Handler
Entity
Resolver
Document Builder
Factory
Business
Logic
32

Особенности SAX и DOM
SAX |
DOM |
Модель обработки событий |
Древовидная структура данных |
Последовательный доступ (поток |
Произвольный доступ (структура |
событий) |
данных в памяти) |
Используется мало памяти |
Используется много памяти |
(порождаются только события) |
(документ загружен полностью) |
Для обработки частей документа |
Для редактирования документа |
(обработка релевантных |
(обработка данных в памяти) |
событий) |
|
Для однократной обработки |
Для многократной обработки |
документа |
документа |
33

Работа с XML в Java
Стандартные интерфейсы
В оригинале описаны на Interface Definition Language (OMG IDL)
Пакет org.w3c.domПакет org.xml.sax
Реализующие классы
Предоставляются отдельно…
JAVA API for XML Processing (JAXP) Пакет javax.xml
34

Работа с SAX
Обработку документа производит транслятор, передающий информацию зарегистрировавшимся обработчикам событий
Обработчики должны реализовывать интерфейсы
org.xml.sax.ContentHandler
org.xml.sax.DTDHandler
org.xml.sax.EntityResolver |
SAX |
org.xml.sax.ErrorHandler
org.xml.sax.Locator
org.xml.sax.ext.DeclHandler
org.xml.sax.ext.EntityResolver2 |
SAX2 |
|
org.xml.sax.ext.LexicalHandler |
||
|
||
org.xml.sax.ext.Locator2 |
|
35

Пакет javax.xml.parsers
Класс SAXParserFactory
Образец проектирования Singleton, позволяет настроить и получить экземпляр фабрики для производства SAXParser
Класс SAXParser
Непосредственно транслятор, экземпляры получаются от фабрики
SAXParserFactory
36

Семантика документа
Возникающие
события
startElement / endElement
Открывающий и закрывающий тэг
characters
Символы
startDocument / endDocument
Начало и конец документа
Интерфейс
ContentHandler
startElement()
endElement()
characters()
startDocument()
endDocument()
37

Создание обработчика событий
Реализация нужного интерфейса, настройка на него используемого транслятора
Использование класса
org.xml.sax.helpers.DefaultHandler или
org.xml.sax.helpers.DefaultHandler2
реализующих все интерфейсы обработки событий (все методы имеют пустые тела)
38

Пример. Файл XML
<?xml version="1.0"?>
<company>
<staff>
<firstname>Tom</firstname>
<lastname>King</lastname>
<nickname>Boss</nickname>
<salary>100500</salary>
</staff>
<staff>
<firstname>Ben</firstname>
<lastname>Gum</lastname>
<nickname>Bubble</nickname>
<salary>100000</salary>
</staff>
</company>
39

Пример. Часть 1
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReadXMLFile {
public static void main(String argv[]) { try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() { boolean bfname = false;
boolean blname = false; boolean bnname = false; boolean bsalary = false;
...
40

Пример. Часть 2
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("Start Element: " + qName); if (qName.equalsIgnoreCase("FIRSTNAME")) {
bfname = true;
}
if (qName.equalsIgnoreCase("LASTNAME")) { blname = true;
}
if (qName.equalsIgnoreCase("NICKNAME")) { bnname = true;
}
if (qName.equalsIgnoreCase("SALARY")) { bsalary = true;
}
}
...
41