Phân tích cú pháp tệp XML bằng SAX Parser



Java cung cấp nhiều cách để phân tích cú pháp tệp XML như phân tích cú pháp tệp XML bằng trình phân tích cú pháp DOM, trình phân tích cú pháp SAX hoặc trình phân tích cú pháp StAX.

Java cung cấp nhiều cách để phân tích cú pháp một tệp XML. Ví dụ: phân tích cú pháp tệp XML bằng trình phân tích cú pháp DOM, trình phân tích cú pháp SAX hoặc trình phân tích cú pháp StAX. Trong bài đăng này, chúng ta sẽ xem cách phân tích cú pháp tệp XML bằng trình phân tích cú pháp SAX





các sự kiện trong javascript là gì

Trước khi đi vào chi tiết về cách phân tích cú pháp tệp XML bằng trình phân tích SAX, trước tiên chúng ta hãy xem sự khác biệt giữa phân tích cú pháp qua các trình phân tích cú pháp khác nhau và khi nào nên chọn cái này hơn cái kia.

SAX Parser - SAX là từ viết tắt của Simple API for XML. SAX Parser phân tích cú pháp từng dòng của tệp XML và kích hoạt các sự kiện khi nó gặp phải thẻ mở, thẻ đóng hoặc dữ liệu ký tự trong tệp XML. Đây là lý do tại sao trình phân tích cú pháp SAX được gọi là trình phân tích cú pháp dựa trên sự kiện



DOM Parser - DOM là từ viết tắt của Document Object Model. Không giống như trình phân tích cú pháp SAX, trình phân tích cú pháp DOM tải tệp XML hoàn chỉnh vào bộ nhớ và tạo cấu trúc cây trong đó mỗi nút trong cây đại diện cho một thành phần của tệp XML. Với trình phân tích cú pháp DOM, bạn có thể tạo các nút, xóa các nút, thay đổi nội dung của chúng và duyệt qua hệ thống phân cấp nút. DOM cung cấp tính linh hoạt tối đa trong khi làm việc với các tệp XML nhưng nó đi kèm với chi phí bộ nhớ lớn tiềm ẩn và các yêu cầu xử lý đáng kể trong trường hợp các tệp XML lớn

StAX Parser - StAX là từ viết tắt của Streaming API for XML. Trình phân tích cú pháp dựa trên luồng rất hữu ích khi ứng dụng của bạn có giới hạn về bộ nhớ. Ví dụ: điện thoại di động chạy Java Micro Edition. Tương tự, nếu ứng dụng của bạn cần xử lý nhiều yêu cầu đồng thời, ví dụ như một máy chủ ứng dụng, thì nên sử dụng trình phân tích cú pháp StAX.

Phân tích cú pháp dựa trên luồng còn có thể được phân loại là:

Kéo phân tích cú pháp - Trong phân tích cú pháp kéo, ứng dụng khách gọi các phương thức trên thư viện phân tích cú pháp XML khi nó cần tương tác với một tập thông tin XML. Nói cách khác, máy khách chỉ nhận được dữ liệu XML khi nó yêu cầu rõ ràng.



Đẩy phân tích cú pháp - Trong phân tích cú pháp đẩy, bộ phân tích cú pháp XML sẽ đẩy dữ liệu XML đến máy khách, khi nó gặp các phần tử trong một tập thông tin XML. Nói cách khác, trình phân tích cú pháp gửi dữ liệu đến ứng dụng bất kể ứng dụng đã sẵn sàng để sử dụng hay chưa.

So sánh giữa SAX, DOM và StAX parser:

Bảng dưới đây tóm tắt các tính năng của trình phân tích cú pháp SAX, DOM và StAX

Java_bloge_2

Bây giờ chúng ta đã biết về các trình phân tích cú pháp khác nhau, hãy xem cách phân tích cú pháp tệp XML bằng trình phân tích cú pháp SAX

Tệp XML
Dưới đây là tệp XML mà chúng ta sẽ phân tích cú pháp và xây dựng các đối tượng Java

Bản sắc Bourne Doug Liman 119 Matt Damon, Franka Potente 2002 The Bourne Supremacy Paul Greengrass 108 Matt Damon, Franka Potente, Joan Allen 2004 The Bourne Ultimatum Paul Greengrass 115 Matt Damon, Edgar Ramirez, Joan Allen 2007 The Bourne Legacy Tony Gilroy 135 Jeremy Renner , Rachel Weisz, Edward Norton 2012

Cấu trúc dự án
Đây là ảnh chụp màn hình của cấu trúc dự án trong Eclipse IDE

Đây là lớp DVD chứa danh sách các đối tượng phim

lớp python __init__
package co.edureka.parsers.sax import java.util.List public class DVD {private String name private List phim public String getName () {return name} public void setName (String name) {this.name = name} public List getMovies () {return movies} public void setMovies (Liệt kê phim) {this.movies = phim}}

Đối tượng phim có các thuộc tính như tên, đạo diễn, thời gian chạy (thời lượng) của phim, năm phát hành và dàn diễn viên của phim

package co.edureka.parsers.sax public class Movie {private String name private String director private int runtime private int release private String cast public String getName () {return name} public void setName (String name) {this.name = name} public String getDirectors () {return director} public void setDirectors (String director) {this.directors = director} public int getRuntime () {return runtime} public void setRuntime (int runtime) {this.runtime = runtime} public int getReleased ( ) {return release} public void setReleased (int release) {this.released = release} public String getCast () {return cast} public void setCast (String cast) {this.cast = cast} @Override public String toString () { return 'Phim [tên =' + tên + ', đạo diễn =' + đạo diễn + ', thời gian chạy =' + thời gian chạy + ', đã phát hành =' + phát hành + ', diễn viên =' + diễn viên + ']'}}

Triển khai SAX Handler:

Chúng tôi sẽ mở rộng org.xml.sax.helpers. Lớp DefaultHandler cung cấp nhiều phương thức gọi lại và sẽ ghi đè các phương thức sau:

startElement () - Phương thức này được gọi khi bắt đầu một thẻ

endElement () - Phương thức này được gọi khi gặp phải cuối thẻ

nhân vật() - Phương thức này được gọi khi gặp một số dữ liệu văn bản

Lưu ý: Có nhiều phương thức gọi lại khác như startDocument (), endDocument (), v.v. có thể được ghi đè nếu cần.

các sự kiện trong javascript là gì
package co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler public class SAXHandler mở rộng DefaultHandler {DVD dvd = new DVD ( ) ListmovieList = new ArrayList () Movie movie = null String content = null public void startElement (String namespaceURI, String localName, String qname, Attributes thuộc tính) {if (qname.equals ('dvd')) {String dvdName = properties.getValue ('name') dvd.setName (dvdName)} else if (qname.equals ('movie')) {movie = new Movie ()}} public void endElement (String namespaceURI, String localName, String qname) {switch (qname ) {case 'movie': movieList.add (movie) break case 'name': movie.setName (content) break case 'director': movie.setDirectors (content) break case 'release': movie.setReleased (Integer.parseInt (nội dung)) break case 'runtime': movie.setRuntime (Integer.parseInt (content)) break case 'cast': movie.setCast (content) break case 'dvd': dvd.setMovies (movieList) break}} public void chara cters (char [] ch, int start, int length) {content = new String (ch, start, length)} public DVD getDVD () {return dvd}}

Kiểm tra Trình xử lý SAX
Bây giờ chúng ta hãy kiểm tra SAXHandler của chúng tôi. Dưới đây là lớp thử nghiệm SAXTest, nơi đầu tiên chúng ta lấy một phiên bản SAXParser từ SAXParserFactory và gọi phương thức phân tích cú pháp có hai đối số: Một tệp và một cá thể trình xử lý.

package co.edureka.parsers.sax import java.io.IOException import java.nio.file.Path import java.nio.file.Paths import java.util.List import javax.xml.parsers.ParserConfigurationException import javax.xml.parsers .SAXParser import javax.xml.parsers.SAXParserFactory import org.xml.sax.SAXException public class SAXTest {public static void main (String [] args) ném ParserConfigurationException, SAXException, IOException {SAXml.sax.SAXException public class SAXTest {public static void main (String [] args) ném ParserConfigurationException, SAXException, IOException {SAXmlParserFactory parserPerFacter = parserFactor.newSAXParser () SAXHandler handler = new SAXHandler () Path path = Paths.get ('src / resources', 'movies.xml') parser.parse (path.toFile (), handler) DVD dvd = handler.getDVD ( ) Liệt kê phim = dvd.getMovies () System.out.println ('Tên DVD:' + dvd.getName ()) cho (Movie movie: phim) {System.out.println (movie)}}}

Khi thực thi lớp SAXTest, bạn sẽ nhận được kết quả bên dưới:

Ghi chú : Nếu bạn đang cố gắng phân tích cú pháp tệp XML có cấu trúc khác với movies.xml, thì mã trong phương thức startElement () và endElement () cần được thay đổi.

Nếu bạn quan tâm đến việc thử mã tự mình tải xuống mã
[buttonleads form_title = ”Tải xuống Mã” redirect_url = https: //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text = ”Tải xuống Mã”]

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần bình luận và chúng tôi sẽ liên hệ lại với bạn.

Bài viết liên quan: