Computer >> Máy Tính >  >> Lập trình >> Python

Phân tích cú pháp XML với API SAX bằng Python

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.