Лекция 12. Работа с XML-данными в Java

Содержание

Слайд 2

XML – Extensible Markup Language Для чего нужен: Интеграция данных из

XML – Extensible Markup Language

Для чего нужен:
Интеграция данных из различных источников
Локальная

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

Элементы данных Элементами могут выступать как обычный текст, так и другие,

Элементы данных
Элементами могут выступать как обычный текст, так и другие, вложенные,

элементы документа, секции CDATA, инструкции по обработке, комментарии. Например:


Новосибирск
Siberia


СуМГУ<br>

родной университет




XML. Конструкции языка

Слайд 4

Каждый открывающий тэг, определяющий некоторую область данных в документе обязательно должен

Каждый открывающий тэг, определяющий некоторую область данных в документе обязательно

должен иметь своего закрывающего "напарника“.
В XML учитывается регистр символов.
Все значения атрибутов, используемых в определении тэгов, должны быть заключены в кавычки.
Вся информация, располагающаяся между начальным и конечными тэгами, рассматривается в XML как данные и поэтому учитываются все символы форматирования ( т.е. пробелы, переводы строк, табуляции не игнорируются, как в HTML).
Документ должен иметь только один элемент верхнего уровня (элемент Документ или корневой элемент). Все другие элементы должны быть вложены в элемент верхнего уровня.

Well-formed XML

Слайд 5

Комментарии Cпециальные символы &lt; , &gt; &quot; или &#036;(десятичная форма записи),

Комментарии

Cпециальные символы
< , > " или $(десятичная форма

записи), 
Атрибуты
- имя должно начинаться с буквы или символа подчеркивания (_), после чего могут следовать или не следовать другие буквы, цифры, символы точки (.), тире (–) или подчеркивания;
- каждое имя атрибута может только один раз присутствовать в одном и том же начальном теге или в теге пустого элемента.
Например:
- правильно
- неправильно

XML. Конструкции языка

Слайд 6

строка может быть заключена как в одинарные ('), так и в

строка может быть заключена как в одинарные ('), так и в

двойные кавычки (");
строка не может содержать внутри себя тот же символ кавычек, которыми она ограничена;
строка может содержать ссылку на символ или ссылку на внутренние примитивы общего назначения;
строка не может содержать символ < (Синтаксический анализатор может воспринять этот символ как начало описания XML-разметки.)
строка не может содержать символ &, если это не ссылка на символ или примитив.

XML. Атрибуты

Слайд 7

Директивы анализатора CDATA Необходима чтобы задать область документа, которую при разборе

Директивы анализатора

CDATA
Необходима чтобы задать область документа, которую

при разборе анализатор будет рассматривать как простой текст, игнорируя любые инструкции и специальные символы, но, в отличии от комментариев, иметь возможность использовать их в приложении.
DTD (Document Type Definition)
Содержит правила, описывающие структуру документа
Документ автоматически проверятся на соответствие этим правилам
Описывает дочерние элементы и атрибуты для каждого элемента

XML. Конструкции языка

Слайд 8

Document Type Definition может быть описан в документе или во внешнем файле: ]> Valid XML

Document Type Definition может быть описан в документе или во внешнем

файле:







]>

Valid XML

Слайд 9

Schema Предназначена для того же что и DTD Для описания правил

Schema
Предназначена для того же что и DTD
Для описания правил используется XML
Более

гибкие возможности, чем у DTD
Сложнее в восприятии и создании средств её обработки










XML Schema

<страна
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="country.xsd">
<название>Франция
<население>59.7

Слайд 10

Есть xml-документ: Пример. Входные данные Nikolaj Ivanov 23 PF-11 Petr Kilkin

Есть xml-документ:

Пример. Входные данные





Nikolaj
Ivanov
23
PF-11


Petr
Kilkin
22
FP-22


Petr
Taranov
43
FP-33








Слайд 11

Student: name: Nikolaj surname: Ivanov age: 23 group: PF-11 Student: name:

Student:
name: Nikolaj
surname: Ivanov
age: 23
group: PF-11
Student:
name: Petr

surname: Kilkin
age: 22
group: FP-22
Student:
name: Petr
surname: Taranov
age: 43
group: FP-33

Пример. Желанный результат

Слайд 12

XML парсеры: DOM-парсер (Document Object Model) – предварительно анализируется XML-документ и

XML парсеры:
DOM-парсер (Document Object Model) – предварительно анализируется XML-документ и сохраняется

дерево элементов XML в оперативной памяти. Требователен к ресурсам.
SAX-парсер (Simple API for XML) — парсер, основывающийся на событиях (event-based). Быстр, за счет разбора только конкретной части документа. Занимает мало памяти.

Разбор XML документов

Слайд 13

SAX API (на примере org.xml.sax) Представляет следующие интерфейсы для манипулирования XML:

SAX API (на примере org.xml.sax)
Представляет следующие интерфейсы для манипулирования XML:
ContentHandler –

ключевой интерфейс. Вызывая различные методы интерфейса XMLReader сообщает приложению о содержимом разбираемого документа
DTDHandler – определяет методы которые используются для получения от XMLReader информации о нотации и необрабатываемых обьявлениях сущностей в DTD документа.
ErrorHandler – используется для генерации ридером предупреждений, ошибке или неисправимой ошибке.
InputSource – описывает источник входных данных: поток байт или символов, файл и т.п. откуда парсеру считывать документ.
XMLReader – основной интерфейс содержащий методы парсера реализованые в других классах, таких как SAXParser или SAXParcerFactory
Пакет org.xml.sax.helpers – содержит вспомогательные классы необходимые при работе с SAX-парсерами: DefaultHandler, XMLReaderFactory, XMLReaderImpl, ParserAdapter.

SAX API

Слайд 14

import javax.xml.parsers.*; import org.xml.sax.*; import java.io.IOException; public class SAXExample extends org.xml.sax.helpers.DefaultHandler

import javax.xml.parsers.*;
import org.xml.sax.*;
import java.io.IOException;
public class SAXExample extends org.xml.sax.helpers.DefaultHandler

{
public void process(String filename)
throws SAXException, IOException, ParserConfigurationException {
SAXParserFactory.newInstance().
newSAXParser().parse(filename, this);
}
public static void main(String[] args) throws Exception {
new SAXExample().process(args[0]);
}
...

Пример. SAX-парсинг

Слайд 15

... private int level = 0; private boolean inStudent = false;

...
private int level = 0;
private boolean inStudent = false;


private StringBuffer text = new StringBuffer();
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
level++;
if (level == 2 && qName.equals("student")) {
inStudent = true;
System.out.println("Student:");
}
text.setLength(0);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
text.append(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (level == 3 && inStudent)
System.out.println(" "+ qName +": "+ text);
if (level == 2)
inStudent = false;
level--;
}

Пример. SAX-парсинг. Продолжение

Слайд 16

DOM API (на примере org.w3c.dom) Представляет следующие интерфейсы: Node – представляет

DOM API (на примере org.w3c.dom)
Представляет следующие интерфейсы:
Node – представляет произвольный

элемент дерева (включая текст и атрибуты).
Document – представляет документ DOM и служит корнем дерева документа.
DocumentType – данный интерфейс представляет DTD документа
Element – представляет элемент (тэг) документа, который может иметь подузлы.
DocumentFragment – представляет часть (или фрагмент) документа, один или несколько смежных узлов со всеми подэлементами.
CDATASection – представляет раздел CDATA.
NodeList – представляет упорядоченное множество узлов предназначенных только для чтения.
DOMException – при порождении ошибки API DOM создается экземпляр данного класса

DOM API

Слайд 17

import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.*; import java.io.IOException; public class DOMExample

import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import java.io.IOException;
public class DOMExample

{
public static Document parse(String filename)
throws ParserConfigurationException, SAXException, IOException {
return DocumentBuilderFactory.newInstance().
newDocumentBuilder().parse(filename);
}
public static void main(String[] args) throws Exception {
Document doc = parse(args[0]);
NodeList items = doc.getDocumentElement().getChildNodes();
for (int i = 0; i < items.getLength(); i++)
if (items.item(i).getNodeName().equals("student"))
printStudent(items.item(i));
}
private static void printStudent(Node node) {
System.out.println("Student:");
NodeList nodes = node.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++)
if (nodes.item(i).getNodeType() == Node.ELEMENT_NODE)
System.out.println(" "+ nodes.item(i).getNodeName() + ": "+
nodes.item(i).getFirstChild().getNodeValue());
}
}

Пример. DOM-парсинг

Слайд 18

XSL – eXtensible Stylesheet Language XSLT – трансформации. XML документ, описывающий

XSL – eXtensible Stylesheet Language

XSLT – трансформации. XML документ, описывающий способ преобразования одного

XML документа в другой (не обязательно XML) документ. Пространство имен http://www.w3.org/1999/XSL/Transform.
XPath – язык запросов к XML документу. Состоит из пути к элементу в дереве или вызов функции, результатом запроса будет набор всех элементов, соответствующих пути.
Слайд 19

XSLT – eXtensible Stylesheet Language Transformations ... body ... ... body ... ... ... ...

XSLT – eXtensible Stylesheet Language Transformations



select="xpath expression">... body ...

...
... ...


Слайд 20

XPath Пример: /html/body/*/span[@name="span1" Равнозначно: /child::html/child::body/child::*/child::span[attribute::name="span1"] Оси: ancestor, ancestor-or-self, attribute (@), child

XPath

Пример: /html/body/*/span[@name="span1" Равнозначно: /child::html/child::body/child::*/child::span[attribute::name="span1"]
Оси: ancestor, ancestor-or-self, attribute (@), child (нет), descendant, descendant-or-self

(//), following, following-sibling, namespace, parent (..), preceding, preceding-sibling, self (.)
Функции: document, format-number, node, text, current, position, last, count, id, sum
Примеры:
node//li[last()]
../text()
/root/@attribute
//book[price > 20]
document($path)/root/node
Слайд 21

Student:&#010; : &#010; Пример. XSLT-преобразование




elements="*"/>

Student:





:




Пример. XSLT-преобразование

Слайд 22

import javax.xml.transform.*; import javax.xml.transform.stream.*; import java.io.*; public class TransformXML { public

import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import java.io.*;
public class TransformXML {

public static void main(String[] args)
throws TransformerException, IOException, TransformerConfigurationException {
TransformerFactory.newInstance().
newTransformer(new StreamSource(args[0])).
transform(
new StreamSource(args[1]),
new StreamResult(System.out));
}
}

Пример. XSLT-преобразование из Java