1、对大型文件进行处理;
2、只需要文件的部分内容,或者只需从文件中得到特定信息。
3、想建立自己的对象模型的时候。
在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。
ContentHandler类方法介绍
characters(content)方法
调用时机:
从行开始,遇到标签之前,存在字符,content 的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
startDocument() 方法
文档启动的时候调用。
endDocument() 方法
解析器到达文档结尾时调用。
startElement(name, attrs)方法
遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
endElement(name) 方法
遇到XML结束标签时调用。
make_parser方法
以下方法创建一个新的解析器对象并返回。
xml.sax.make_parser( [parser_list] )
参数说明:
parser_list -
可选参数,解析器列表
parser方法
以下方法创建一个 SAX 解析器并解析xml文档:
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
参数说明:
xmlfile -
xml文件名
contenthandler -
必须是一个ContentHandler的对象
errorhandler -
如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
parseString方法
parseString方法创建一个XML解析器并解析xml字符串:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
参数说明:
xmlstring -
xml字符串
contenthandler -
必须是一个ContentHandler的对象
errorhandler -
如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
Python 解析XML实例
实例
#!/usr/bin/python# -*- coding: UTF-8 -*-importxml.saxclassMovieHandler(xml.sax.ContentHandler):def__init__(self):self.CurrentData=""self.type=""self.format=""self.year=""self.rating=""self.stars=""self.description=""# 元素开始事件处理defstartElement(self,tag,attributes):self.CurrentData=tagiftag=="movie":print"*****Movie*****"title=attributes["title"]print"Title:",title# 元素结束事件处理defendElement(self,tag):ifself.CurrentData=="type":print"Type:",self.typeelifself.CurrentData=="format":print"Format:",self.formatelifself.CurrentData=="year":print"Year:",self.yearelifself.CurrentData=="rating":print"Rating:",self.ratingelifself.CurrentData=="stars":print"Stars:",self.starselifself.CurrentData=="description":print"Description:",self.descriptionself.CurrentData=""# 内容事件处理defcharacters(self,content):ifself.CurrentData=="type":self.type=contentelifself.CurrentData=="format":self.format=contentelifself.CurrentData=="year":self.year=contentelifself.CurrentData=="rating":self.rating=contentelifself.CurrentData=="stars":self.stars=contentelifself.CurrentData=="description":self.description=contentif(__name__=="__main__"):# 创建一个 XMLReaderparser=xml.sax.make_parser()# turn off namepsacesparser.setFeature(xml.sax.handler.feature_namespaces,0)# 重写 ContextHandlerHandler=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 APIs
使用xml.dom解析xml
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
python中用xml.dom.minidom来解析xml文件,实例如下:
实例
#!/usr/bin/python# -*- coding: UTF-8 -*-fromxml.dom.minidomimportparseimportxml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree=xml.dom.minidom.parse("movies.xml")collection=DOMTree.documentElementifcollection.hasAttribute("shelf"):print"Root element : %s"%collection.getAttribute("shelf")# 在集合中获取所有电影movies=collection.getElementsByTagName("movie")# 打印每部电影的详细信息formovieinmovies:print"*****Movie*****"ifmovie.hasAttribute("title"):print"Title: %s"%movie.getAttribute("title")type=movie.getElementsByTagName('type')[0]print"Type: %s"%type.childNodes[0].dataformat=movie.getElementsByTagName('format')[0]print"Format: %s"%format.childNodes[0].datarating=movie.getElementsByTagName('rating')[0]print"Rating: %s"%rating.childNodes[0].datadescription=movie.getElementsByTagName('description')[0]print"Description: %s"%description.childNodes[0].data
以上程序执行结果如下:
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
完整的 DOM API 文档请查阅Python DOM APIs。