25/09/2018, 08:41

Java SAX Parser – đọc tài liệu XML

PHP Bài này viettuts.vn 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 ...

PHP

Bài này viettuts.vn 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.

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.viettuts.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.viettuts.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.viettuts.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
PHP
0