Bài này kienthuclaptrinh.net hướng dẫn bạn sử dụng trình phân tích cú pháp XML Java SAX Parser - đọc tài liệu XML.
SAX Parser có sẵn trong java core, bạn không cần phải tải thư viện nào.
SAX Parser khác với DOM Parser, trình phân tích cú pháp SAX không tải XML hoàn hoàn vào bộ nhớ, thay vào đó nó phân tích cú pháp XML bằng cách kích hoạt các sự kiện khác nhau và khi nó gặp các phần tử khác nhau như: thẻ mở, thẻ đóng, ký tự dữ liệu, comment v.v. Đây là lý do tại sao SAX Parser được gọi là trình phân tích cú pháp dựa trên sự kiện.
Để đọc tài liệu XML với SAX Parser chúng ta cần phải tạo ra một lớp kế thừa lớp DefaultHandler. Lớp DefaultHandler cung cấp các callback khác nhau như sau:
- startElement(): kích hoạt sự kiện này khi bắt đầu thẻ.
- endElement(): kích hoạt sự kiện này khi gặp thẻ đóng.
- characters(): kích hoạt sự kiện này khi nó gặp một số dữ liệu văn bản.
Nội dung chính
Ví dụ sử dụng SAX Parser - đọc tài liệu XML
File input.xml có nội dung như sau:
<?xml version = "1.0"?> <class> <student id = "1"> <firstname>Vinh</firstname> <lastname>Phan</lastname> <marks>85</marks> </student> <student id = "2"> <firstname>Hoa</firstname> <lastname>Nguyen</lastname> <marks>95</marks> </student> <student id = "3"> <firstname>Phu</firstname> <lastname>Tran</lastname> <marks>90</marks> </student> </class>
Tạo lớp Student.java
package vn.kienthuclaptrinh.javaxml; public class Student { private String id; private String firstName; private String lastName; private String marks; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getMarks() { return marks; } public void setMarks(String marks) { this.marks = marks; } @Override public String toString() { return "@Student, id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", marks=" + marks; } }
Tạo lớp UserHandler.java kế thừa lớp DefaultHandler.java để xử lý đọc tài liệu XML:
package vn.kienthuclaptrinh.javaxml; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class UserHandler extends DefaultHandler { private String content; private Student student; private List<Student> listStudents = new ArrayList<>();; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // tạo đối tượng Student khi bắt đầu thẻ "student" if ("student".equalsIgnoreCase(qName)) { student = new Student(); student.setId(attributes.getValue("id")); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { switch (qName) { case "student": // add đối tượng Student vào list khi gặp thẻ đóng "student" listStudents.add(student); break; case "firstname": student.setFirstName(content); break; case "lastname": student.setLastName(content); break; case "marks": student.setMarks(content); break; } } @Override public void characters(char ch[], int start, int length) throws SAXException { // đọc nội dung của thẻ hiện tại content = String.copyValueOf(ch, start, length).trim(); } public List<Student> getListStudents() { return listStudents; } public void setListStudents(List<Student> listStudents) { this.listStudents = listStudents; } }
Tạo lớp SAXExample1.java chứa phương thức main() để thực thi đọc tài liệu XML và in kết quả ra màn hình:
package vn.kienthuclaptrinh.javaxml; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SAXExample1 { public static void main(String[] args) { try { File inputFile = new File("D:\\xml\\input.xml"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); UserHandler userhandler = new UserHandler(); // phân tích tài liệu XML saxParser.parse(inputFile, userhandler); // in list đối tượng student ra màn hình for (Student student : userhandler.getListStudents()) { System.out.println(student.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
Kết quả:
@Student, id=1, firstName=Vinh, lastName=Phan, marks=85 @Student, id=2, firstName=Hoa, lastName=Nguyen, marks=95 @Student, id=3, firstName=Phu, lastName=Tran, marks=90