SAX là một giao diện tiêu chuẩn để phân tích cú pháp XML theo hướng sự kiện. Phân tích cú pháp XML với SAX thường yêu cầu bạn tạo ContentHandler của riêng mình bằng cách phân lớp con xml.sax.ContentHandler.
ContentHandler của bạn xử lý các thẻ và thuộc tính cụ thể của (các) hương vị XML của bạn. Đối tượng ContentHandler cung cấp các phương thức để xử lý các sự kiện phân tích cú pháp khác nhau. Trình phân tích cú pháp riêng của nó gọi các phương thức ContentHandler vì nó phân tích cú pháp tệp XML.
Các phương thức startDocument và endDocument được gọi ở phần đầu và phần cuối của tệp XML. Các ký tự phương thức (văn bản) được truyền dữ liệu ký tự của tệp XML thông qua văn bản tham số.
ContentHandler được gọi ở đầu và cuối mỗi phần tử. Nếu trình phân tích cú pháp không ở chế độ không gian tên, các phương thức startElement (thẻ, thuộc tính) và endElement (thẻ) được gọi; nếu không, các phương thức tương ứng startElementNS và endElementNS được gọi. Ở đây, thẻ là thẻ phần tử và các thuộc tính là một đối tượng Thuộc tính.
Dưới đây là các phương pháp quan trọng khác cần hiểu trước khi tiếp tục -
Phương pháp make_parser
Phương thức sau tạo một đối tượng phân tích cú pháp mới và trả về nó. Đối tượng phân tích cú pháp được tạo sẽ thuộc loại trình phân tích cú pháp đầu tiên mà hệ thống tìm thấy.
xml.sax.make_parser( [parser_list] )
Đây là chi tiết của các thông số -
- parser_list - Đối số tùy chọn bao gồm danh sách các trình phân tích cú pháp để sử dụng, tất cả các trình này đều phải triển khai phương thức make_parser.
Phương pháp phân tích cú pháp
Phương thức sau tạo một trình phân tích cú pháp SAX và sử dụng nó để phân tích cú pháp tài liệu.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Đây là chi tiết của các thông số -
- xmlfile - Đây là tên của tệp XML để đọc từ đó.
- trình xử lý nội dung - Đây phải là đối tượng ContentHandler.
- trình xử lý lỗi - Nếu được chỉ định, trình xử lý lỗi phải là đối tượng SAX ErrorHandler.
Phương thức phân tích cú pháp
Có một phương pháp nữa để tạo trình phân tích cú pháp SAX và phân tích cú pháp chuỗi XML được chỉ định .
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Đây là chi tiết của các thông số -
- xmlstring - Đây là tên của chuỗi XML để đọc từ đó.
- trình xử lý nội dung - Đây phải là đối tượng ContentHandler.
- trình xử lý lỗi - Nếu được chỉ định, trình xử lý lỗi phải là đối tượng SAX ErrorHandler.
Ví dụ
#!/usr/bin/python import xml.sax class MovieHandler( xml.sax.ContentHandler ): def __init__(self): self.CurrentData = "" self.type = "" self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = "" # Call when an element starts def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" title = attributes["title"] print "Title:", title # Call when an elements ends def endElement(self, tag): if self.CurrentData == "type": print "Type:", self.type elif self.CurrentData == "format": print "Format:", self.format elif self.CurrentData == "year": print "Year:", self.year elif self.CurrentData == "rating": print "Rating:", self.rating elif self.CurrentData == "stars": print "Stars:", self.stars elif self.CurrentData == "description": print "Description:", self.description self.CurrentData = "" # Call when a character is read def characters(self, content): if self.CurrentData == "type": self.type = content elif self.CurrentData == "format": self.format = content elif self.CurrentData == "year": self.year = content elif self.CurrentData == "rating": self.rating = content elif self.CurrentData == "stars": self.stars = content elif self.CurrentData == "description": self.description = content if ( __name__ == "__main__"): # create an XMLReader parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # override the default ContextHandler Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")
Điều này sẽ tạo ra kết quả sau -
*****Movie***** Title: Enemy Behind Type: War, Thriller Format: DVD Year: 2003 Rating: PG Stars: 10 Description: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Year: 1989 Rating: R Stars: 8 Description: A schientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Stars: 10 Description: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Stars: 2 Description: Viewable boredom
Để biết chi tiết đầy đủ về tài liệu SAX API, vui lòng tham khảo các API SAX Python tiêu chuẩn.