使用 Python 中的 SAX API 解析 XML


SAX 是一個用於事件驅動的 XML 解析的標準介面。使用 SAX 解析 XML 通常需要您透過子類化 xml.sax.ContentHandler 來建立自己的 ContentHandler。

您的 ContentHandler 處理您喜歡的 XML 格式的特定標籤和屬性。ContentHandler 物件提供方法來處理各種解析事件。它的擁有者解析器在解析 XML 檔案時呼叫 ContentHandler 方法。

方法 startDocument 和 endDocument 分別在 XML 檔案的開始和結束時被呼叫。方法 characters(text) 透過引數 text 傳遞 XML 檔案的字元資料。

在每個元素的開始和結束時都會呼叫 ContentHandler。如果解析器不是在名稱空間模式下,則會呼叫方法 startElement(tag, attributes) 和 endElement(tag);否則,將呼叫相應的方法 startElementNS 和 endElementNS。這裡,tag 是元素標籤,attributes 是一個 Attributes 物件。

在繼續之前,以下是一些其他需要了解的重要方法:

make_parser 方法

以下方法建立一個新的解析器物件並返回它。建立的解析器物件將是系統找到的第一個解析器型別。

xml.sax.make_parser( [parser_list] )

以下是引數的詳細資訊:

  • **parser_list** - 可選引數,包含要使用的解析器列表,這些解析器必須都實現 make_parser 方法。

parse 方法

以下方法建立一個 SAX 解析器並使用它來解析文件。

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

以下是引數的詳細資訊:

  • **xmlfile** - 這是要從中讀取的 XML 檔案的名稱。
  • **contenthandler** - 這必須是一個 ContentHandler 物件。
  • **errorhandler** - 如果指定,errorhandler 必須是一個 SAX ErrorHandler 物件。

parseString 方法

還有一種方法可以建立 SAX 解析器並解析指定的 **XML 字串**。

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

以下是引數的詳細資訊:

  • **xmlstring** - 這是要從中讀取的 XML 字串的名稱。
  • **contenthandler** - 這必須是一個 ContentHandler 物件。
  • **errorhandler** - 如果指定,errorhandler 必須是一個 SAX ErrorHandler 物件。

示例

#!/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")

這將產生以下結果:

*****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

有關 SAX API 文件的完整詳細資訊,請參閱標準 Python SAX API

更新於:2020年1月31日

7K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.