Bài giảng SAX (Simple API for XML)

 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).

pdf20 trang | Chia sẻ: lylyngoc | Lượt xem: 2013 | Lượt tải: 1download
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
Tài liệu liên quan