使用 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。
广告