使用Python中的SAX API解析XML

SAX是用于事件驱动的XML解析的标准接口。使用SAX解析XML通常需要您通过子类化xml.sax.ContentHandler来创建自己的ContentHandler。

您的ContentHandler处理XML风格的特定标记和属性。ContentHandler对象提供了处理各种解析事件的方法。它拥有的解析器在解析XML文件时调用ContentHandler方法。

在XML文件的开始和结尾处调用startDocument和endDocument方法。通过字符文本将方法字符(文本)传递给XML文件的字符数据。

在每个元素的开始和结束处调用ContentHandler。如果解析器不在命名空间模式下,则调用方法startElement(tag,attribute)和endElement(tag);否则,将调用相应的方法startElementNS和endElementNS。在这里,tag是元素标签,而attribute是Attributes对象。

这是在继续之前要了解的其他重要方法-

make_parser方法

以下方法创建一个新的解析器对象并将其返回。创建的解析器对象将是系统找到的第一个解析器类型。

xml.sax.make_parser( [parser_list] )

这是参数的详细信息-

  • parser_list-可选参数,由要使用的解析器列表组成,必须全部实现make_parser方法。

解析方法

以下方法创建一个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