SAX (Simple API for XML): API ñơn giản
cho xử lý tài liệu XML.
Phân tích truy xuất tuần tự.
Các bộ phân tích SAX Parser xử lí thông
tin XML dưới dạng một dòng dữ liệu
(single stream of data).
Dòng dữ liệu là một chiều, không thể phân
tích theo hướng ngược lại.
Dựa trên mô hình hướng sự kiện (event
drive).
20 trang |
Chia sẻ: lylyngoc | Lượt xem: 2013 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Bài giảng SAX (Simple API for XML), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
SAX
Phạm Hồng Phong - SoICT – HUST
SAX
SAX (Simple API for XML): API ñơn giản
cho xử lý tài liệu XML.
Phân tích truy xuất tuần tự.
Các bộ phân tích SAX Parser xử lí thông
tin XML dưới dạng một dòng dữ liệu
(single stream of data).
Dòng dữ liệu là một chiều, không thể phân
tích theo hướng ngược lại.
Dựa trên mô hình hướng sự kiện (event
drive).
2
SAX
Đọc tệp XML từ trên xuống dưới theo mô hình
hướng sự kiện
Các ngôn ngữ lập trình cần ñịnh nghĩa ra
các sự kiện và các hàm tương ứng với sự
kiện.
Người lập trình cần viết các Class dựa trên
các hàm và NNLT ñể xử lý tài liệu XML.
Không coi XML là một cây trên bộ nhớ, chỉ ghi
nhớ cấu trúc nhiệm vụ ñang thi hành trên bộ
nhớ.
3
SAX
4
SAX
Ưu ñiểm
Đơn giản
Tốn ít tài nguyên bộ nhớ
Tốc ñộ xử lý nhanh
Tập trung vào dữ liệu ñang thực thi
Nhược ñiểm
Không thể tác ñộng tới tài liệu XML
Lưu trữ trạng thái phức tạp
Khó khăn khi xử lý tài liệu XML lớn
5
SAX
Bao gồm 2 giao diện:
XMLReader dùng ñể ñọc dữ liệu XML
ContentHandler dùng ñể nhận dữ liệu
6
JAXP
JAXP = Java API for XML Parsing
Cung cấp giao diện chung (Interface) để tạo và sử
dụng các APIs chuẩn của SAX, DOM và XSLT trong
Java.
Tất cả các package của JAXP có sẵn trong JDK 1.4+.
javax.xml.parsers Các APIs chính của JAXP, cung
7
cấp một Interface chung cho các
bộ phân tích SAX và DOM.
org.w3c.dom Định nghĩa các Document class
(một DOM), và các classes cho
các components của DOM.
org.xml.sax Định nghĩa các SAX APIs cơ bản.
javax.xml.transfor
m
Định nghĩa các XSLT APIs ñể biến
ñổi XML thành các dạng khác.
JAXP
javax.xml.parsers ñịnh nghĩa các lớp trừu
tượng DocumentBuilder (cho DOM) và
SAXParser (cho SAX)
Nó cũng định nghĩa các lớp factory
DocumentBuilderFactory and SAXParserFactory. Mặc
định, các lớp này cho thực thi tham chiếu - reference
implementation” của DocumentBuilder and SAXParser.
JDK bao gồm cả 3 thực thi XML parser của
Apache:
Crimson: phiên bản đầu tiên – nhỏ và nhanh, thực thi chuẩn cho
J2SE 1.4. Dựa trên code dành cho Apache của Sun.
Xerces: nhiều tính năng, hỗ trợ XML Schema. Dựa trên code
dành cho Apache của Sun.
Xerces 2: Tương lai, thực thi chuẩn cho J2SE 5.0.
8
DocumentBuilder
java.io.File file = new java.io.File("c:/news.xml");
javax.xml.parsers.DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document doc=null; /* mô hình DOM */
if (file.exists()){
doc = db.parse(file);
}
if (doc != null) {
/* xử lí */
NodeList nodes = doc.getElementsByTagName("content");
for (int i = 0; i < nodes.getLength(); i++) {
Element e = (Element) nodes.item(i);
/* xử lí */
}
}
9
Sử dụng SAX 1
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
// tạo một ñối tương SAXParser
SAXParserFactory factory =
SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
// kích hoạt parser sử dụng content handler của ƯD
saxParser.parse(inputStream, myContentHandler);
saxParser.parse(file, myContentHandler);
saxParser.parse(url, myContentHandler);
10
Sử dụng SAX 2
// Tạo SAX Factory
SAXParserFactory spf = SAXParserFactory.newInstance();
// Không validate file XML
spf.setValidating(false);
// Tạo SAX Parser
SAXParser saxParser = spf.newSAXParser();
// Tạo XML reader
XMLReader reader = saxParser.getXMLReader();
FileReader file = new FileReader("thuVien.xml");
// Gắn handle của lớp hiện hành vào reader
reader.setContentHandler(new docXMLBangSax());
// ñọc XML
reader.parse(new InputSource(file));
11
Định nghĩa một Content Handler
Phương pháp ñơn giản: Tạo một Class mới
kế thừa từ:
org.xml.sax.helpers.DefaultHandler
Ghi ñè các phương thức xử lý sự kiện
(event - handling) từ DefaultHandler:
12
startDocument() // receive notice of start of document
endDocument() // receive notice of end of document
startElement() // receive notice of start of each element
endElement() // receive notice of end of each element
characters() // receive a chunk of character data
error() // receive notice of recoverable parser error
// ...plus more...
startElement() và endElement()
SAXParser sẽ phân tích callback ñể thông
báo sự kiện:
startElement(String namespaceURI, String
localName, String qName, Attributes atts)
endElement(String namespaceURI, String
13
localName, String qName)
Đối với các trường hợp ñơn giản, bỏ qua namespaceURI và
localName, và chỉ sử dụng qName (the “qualified” name).
startElement() và endElement() là các sự kiện luôn xuất
hiện theo cặp: “” sẽ sinh ra lời gọi:
startElement("", "", "foo", null)
endElement("", "", "foo")
SAX Attributes
Mỗi lời gọi tới startElement() bao gồm
Attributes ñể biểu diễn tất cả các thuộc tính
XML cho element ñó.
Các phương thức trong giao diện Attributes
getLength() // return number of attributes
getIndex(String qName) // look up attribute's index by
qName
getValue(String qName) // look up attribute's value by
qName
getValue(int index) // look up attribute's value by
index
// ... and others ...
14
SAX characters()
Thẻ sự kiện (event handler) characters() nhận khai
báo của các dữ liệu kí tự dạng plain text, chẳng hạn
Nội dung không thuộc về phần tử XML nào.
public void characters(char[] ch, /*
buffer containing chars */, int start,
start position in buffer */, int length
*/num of chars to read )
Có thể ñược gọi rất nhiều lần bên trong mỗi một block
các kí tự, ví dụ mỗi lần gọi một dòng.
Có thể sử dụng ñể gộp các dữ liệu kí tự vào một
Stringbuffer và dừng việc gộp lại ở lần gọi
startElement()kế tiếp.
15
SAX
Phương thức tổng quát: tạo ra một XML
parser, phân tích documents, và nhận
thông tin của document.
“Streaming” information set
Ứng dụng đăng ký handlers
Bộ Parser “đẩy ” thông tin vào handlers
• Tuần tự (“as you see it”)
Ứng dụng chỉ sử dụng các thông tin nó cần.
16
javax.xml.parsers
DOM
DocumentBuilder, DocumentBuilderFactory
SAX
SAXParser, SAXParserFactory
Lỗi, ngoại lệ
FactoryConfigurationError
ParserConfigurationException
17
SAX Phân tích Document
Tạo một thể hiện của SAX parser factory
SAXParserFactory factory =
SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
Tạo bộ phân tích SAX parser
SAXParser parser = factory.newSAXParser();
Phân tích tài liệu
parser.parse(“document.xml”, new MyHandler());
18
So sánh SAX và DOM
SAX = Simple API cho XML DOM = Document Object Model
Đặc tả Java Chuẩn W3C ñể trình bày các tài
liệu có cấu trúc. Là nền tảng và
trung lập ngôn ngữ
Duyệt XML như luồng các Events Duyệt XMl như cây của các Node
SAX Parser sẽ kích hoạt các event
– handler khi phân tích
Xây dựng mô hình dữ liệu (data
model) trong bộ nhớ
Truy xuất tuần tự Khả năng truy xuất dữ liệu ngẫu
nhiên, hiệu quả cho các ứng dụng
tương tác
Rất nhanh, tốn ít tài nguyên Đòi hỏi CPU và Memory mạnh
Là lựa chọn tốt khi: Mô hình dữ liệu
không cần thiết Hoặc cấu trúc bản
chất cho mô hình dữ liệu là List
hoặc Matrix
Hiệu quả khi mô hình dữ liệu có
cấu trúc cây các nút.
19
20