IT Research Department @BKAP 2015 Trang 1 / 24 Lab 01 Introduction to JAXP Simple API for XML SAX Mục tiêu - Sử dụng SAX duyệt file XML - Cách cài đặt Parser SAXParserFactory, SAXPars
Trang 1IT Research Department @BKAP 2015 Trang 1 / 24
Lab 01
Introduction to JAXP Simple API for XML (SAX) Mục tiêu
- Sử dụng SAX duyệt file XML
- Cách cài đặt Parser (SAXParserFactory, SAXParser)
- Sử dụng Parsing Content bằng cách kế thừa ContentHandler, DefaultHandler
- Sử dụng XMLReader để đăng ký phân tích file XML
Trang 2 Output: In ra màn hình theo SAX Parser
Step 1: Tạo project java mới trong netbean
File New Project Java Java Application
Project Name: Đặt tên project là INTXML
Sau khi tạo ta được Project có cấu trúc như sau:
Step 2: Tạo file Employees.xml
Project New XML XML Document
Trang 3IT Research Department @BKAP 2015 Trang 3 / 24
Trang 4 File Employees.xml sau khi tạo thành
Tạo nội dung cho Employees.xml
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employeeid="111">
<firstname>Allen</firstname>
<lastname>Smith</lastname>
<location>Alaska</location>
</employee>
<employeeid="112">
<firstname>John</firstname>
<lastname>Davis</lastname>
Trang 5IT Research Department @BKAP 2015 Trang 5 / 24
<location>California</location>
</employee>
<employeeid="113">
<firstname>Bob</firstname>
<lastname>Thomson</lastname>
<location>Kansas</location>
</employee>
</employees>
Step 3: Tạo lớp xử lý nội dung XML – Content Handler
Intxml New Java Java Class
SaxHandler.java
/*
* To change this license header, choose License Headers in Project Properties
* To change this template file, choose Tools | Templates
* and open the template in the editor
*/
package intxml;
Trang 6publicvoid startDocument() throws SAXException {
System.out.println("Start document");
}
//End Document
@Override
publicvoid endDocument() throws SAXException {
System.out.println("End document");
System.out.println("Start element: "+qname);
//In attributes nếu element là employee
if (qname.equals("employee")) {
int atts = attributes.getLength();
for (int i = 0; i < atts; i++) {
String atrName = attributes.getQName(i);
String atrValue = attributes.getValue(i);
System.out.println("Attributes: "+atrName+" "+atrValue);
Trang 7IT Research Department @BKAP 2015 Trang 7 / 24
Trang 8 implements ContentHandler thì phải implement tất cả abstract methods
extends DefaultHandler thì chỉ dùng các methods mình cần sử dụng
Step 4: Triển khai tại hàm main của chương trình
INTXML.java
/*
* To change this license header, choose License Headers in Project Properties
* To change this template file, choose Tools | Templates
* and open the template in the editor
*/
package intxml;
Trang 9IT Research Department @BKAP 2015 Trang 9 / 24
//Tạo SaxHandler xử lý nội dung
SaxHandler sax = new SaxHandler();
//Tạo SAX ParserFactory
SAXParserFactory parserFactory = SAXParserFactory.newInstance(); //Tạo SAX Parser trên Factory đã khai báo
SAXParser parser = parserFactory.newSAXParser();
//Khai báo 1 XML Reader dựa trên SAXParser object
XMLReader xmlReader = parser.getXMLReader();
//Xác định đối tượng chịu trách nhiệm xử lý nội dung XML
xmlReader.setContentHandler(sax);
//Tiến hành phân tích dữ liệu nguồn cung cấp bởi file XML
xmlReader.parse(new InputSource("Employees.xml"));
Trang 10Step 5: Build và Run ứng dụng
Bài 1.2
Phát triển tiếp bài 1.1
Sử dụng XML locator để chỉ ra vị trí current parser đang phân tích
Sử dụng Instruc tions để đọc các chỉ thị của các chương trình khác có định dạng: <?target parameter(s)?>
Thông báo lỗi khi file XML sai cấu trúc
Step 1: Sử dụng XML locator để chỉ ra vị trí current parser
SaxHandler.java
Trang 11IT Research Department @BKAP 2015 Trang 11 / 24
/*
* To change this license header, choose License Headers in Project Properties
* To change this template file, choose Tools | Templates
* and open the template in the editor
publicclass SaxHandler implements ContentHandler{
//Khai báo biến locator
private Locator locator;
publicvoid startDocument() throws SAXException {
System.out.println("Start document");
}
//End Document
@Override
publicvoid endDocument() throws SAXException {
System.out.println("End document");
System.out.println("Start element: "+qname);
//In location cua element dang duyet
if (locator!=null) {
Trang 12System.out.println("LOCATOR XML-document name:
"+locator.getSystemId()+", column"+locator.getColumnNumber()+",
line"+locator.getLineNumber());
}
//In attributes nếu element là employee
if (qname.equals("employee")) {
int atts = attributes.getLength();
for (int i = 0; i < atts; i++) {
String atrName = attributes.getQName(i);
String atrValue = attributes.getValue(i);
System.out.println("Attributes: "+atrName+" "+atrValue);
Trang 13IT Research Department @BKAP 2015 Trang 13 / 24
publicvoid setDocumentLocator(Locator locator) {
this.locator = locator;
Trang 14<firstname>Allen</firstname>
<lastname>Smith</lastname>
<location>Alaska</location>
</employee>
Trang 15IT Research Department @BKAP 2015 Trang 15 / 24
<employeeid="112">
<firstname>John</firstname>
<lastname>Davis</lastname>
<location>California</location>
</employee>
<employeeid="113">
<firstname>Bob</firstname>
<lastname>Thomson</lastname>
<location>Kansas</location>
Trang 16Step 3: Thông báo lỗi khi file XML sai cấu trúc
Tạo lớp ErrorHandler.java để xử lý các lỗi sai cấu trúc
IntxmlnewOtherJavaJava Classđặt tên ErrorHandler
/*
* To change this license header, choose License Headers in Project Properties
* To change this template file, choose Tools | Templates
* and open the template in the editor
publicvoid error(SAXParseException exception) throws SAXException {
showError("Error", exception);
Trang 17IT Research Department @BKAP 2015 Trang 17 / 24
}
Khai báo trong hàm Main của INTXML.java
/*
* To change this license header, choose License Headers in Project Properties
* To change this template file, choose Tools | Templates
* and open the template in the editor
//Tạo SaxHandler xử lý nội dung
SaxHandler sax = new SaxHandler();
//Tạo ErrorHandler thông báo lỗi
ErrorHandler err = new ErrorHandler();
//Tạo SAX ParserFactory
SAXParserFactory parserFactory = SAXParserFactory.newInstance(); //Tạo SAX Parser trên Factory đã khai báo
SAXParser parser = parserFactory.newSAXParser();
//Khai báo 1 XML Reader dựa trên SAXParser object
XMLReader xmlReader = parser.getXMLReader();
//Xác định đối tượng chịu trách nhiệm xử lý lỗi khi phân tích XML
xmlReader.setErrorHandler(err);
//Xác định đối tượng chịu trách nhiệm xử lý nội dung XML
Trang 18xmlReader.setContentHandler(sax);
//Tiến hành phân tích dữ liệu nguồn cung cấp bởi file XML
xmlReader.parse(new InputSource("Employees.xml"));
<firstname>Allen</firstname>
<lastname>Smith</lastname>
<location>Alaska</location>
</employee>
<employeeid="112">
<firstname12>John</firstname>
<lastname>Davis</lastname>
<location>California</location>
</employee>
<employeeid="113">
<firstname>Bob</firstname>
<lastname>Thomson</lastname>
<location>Kansas</location>
</employee>
</employees>
Build and Run ứng dụng
Trang 19IT Research Department @BKAP 2015 Trang 19 / 24
Bài 1.3
Xây dựng ứng dụng SAX:
Duyệt file Personnels.xml
Xây dựng lớp Filter kế thừa interface XMLFilterImpl để thay đổi attributes
status = “donotcontact” đối với các element có deptid bằng 3
Step 1: Duyệt file Personnels.xml (làm theo các step như bài 1.1)
SaxHandler.java kế thừa DefaultHandler
Trang 20publicclass SAXHandler extends DefaultHandler {
@Override
publicvoid startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("employee")) {
if (attributes.getValue("status").equals("contact")) {
System.out.println("Contacting employee "
SAXHandler sax = new SAXHandler();
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
SAXParser parser = parserFactory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(sax);
xmlReader.parse(new InputSource("Personnels.xml"));
Trang 21IT Research Department @BKAP 2015 Trang 21 / 24
Build and Run ứng dụng
Step 2: Xây dựng lớp Filter
Tạo lớp DataFilter.java kế thừa XMLFilterImpl
Trang 22SAXHandler sax = new SAXHandler();
SAXParserFactory parserFactory = SAXParserFactory.newInstance(); SAXParser parser = parserFactory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
Trang 23IT Research Department @BKAP 2015 Trang 23 / 24
Build and Run ứng dụng
PHẦN 2: BÀI TẬP TỰ LÀM
Viết 1 chương trình sử dụng SAX để phân tích một cấu trúc XML có dạng như sau:
In ra màn hình:
Nội dung file xml
Đầy đủ nội dung file xml với cấu trúc file theo SAX
Sử dụng kế thừa theo ContentHandler hoặc DefaultHandler
Vị trí các element đang in
Trang 24 Validate thông báo lỗi khi có lỗi cấu trúc XML
Filter chỉ in ra các hàng hóa có giá bán từ 400USD đến 600USD