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 StAX Parser - đọc tài liệu XML.
StAX là viết tắt của Streaming API for XML và StAX Parser khác với DOM Parser. StAX tương tự như SAX, nhưng có 2 sự khác biệt như sau:
- StAX là một API PULL, trong khi SAX là một API PUSH. Nó có nghĩa là trong trường hợp StAX parser, một ứng dụng khách cần yêu cầu StAX parser nhận thông tin từ XML bất cứ khi nào nó cần. Nhưng trong trường hợp SAX parser, một ứng dụng máy khách được yêu cầu để lấy thông tin khi trình phân tích cú pháp SAX thông báo cho ứng dụng khách mà thông tin có sẵn.
- StAX parser duy trì một con trỏ tại vị trí hiện tại trong tài liệu XML cho phép trích xuất nội dung có sẵn tại con trỏ trong khi trình phân tích cú pháp SAX tạo ra các sự kiện khi gặp một số dữ liệu nhất định.
XMLInputFactory và XMLStreamReader là hai lớp có thể được sử dụng để tải một tệp XML. Và khi chúng ta đọc tài liệu XML bằng cách sử dụng XMLStreamReader, các sự kiện được tạo ra dưới dạng các giá trị số nguyên và sau đó chúng được so sánh với các hằng số trong XMLStreamConstants để xác định sự kiện.
Nội dung chính
Ví dụ sử dụng StAX Parser - đọc tài liệu XML
Ví dụ phân tích cú pháp XML bằng cách sử dụng trình phân tích cú pháp StAX:
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 StAXExample.java
package vn.viettuts.javaxml; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; public class StAXExample { public static void main(String[] args) { List<Student> listStudents; try { listStudents = StAXExample.readListStudents(); // hiển thị các đối tượng student ra màn hình for (Student student : listStudents) { System.out.println(student.toString()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XMLStreamException e) { e.printStackTrace(); } } public static List<Student> readListStudents() throws XMLStreamException, FileNotFoundException { List<Student> listStudents = new ArrayList<>(); Student student = null; String tagContent = null; File inputFile = new File("D:\\xml\\input.xml"); InputStream is = new FileInputStream(inputFile); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(is); // duyệt các phần tử student while (reader.hasNext()) { int event = reader.next(); switch (event) { case XMLStreamConstants.START_ELEMENT: // tạo đối tượng student if ("student".equals(reader.getLocalName())) { student = new Student(); student.setId(reader.getAttributeValue(0)); } break; case XMLStreamConstants.CHARACTERS: // đọc nội dung của thẻ hiện tại tagContent = reader.getText().trim(); break; case XMLStreamConstants.END_ELEMENT: switch (reader.getLocalName()) { case "student": listStudents.add(student); break; case "firstname": student.setFirstName(tagContent); break; case "lastname": student.setLastName(tagContent); break; case "marks": student.setMarks(tagContent); break; } break; } } return listStudents; } }
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