XML
xml:可扩展标记语言
——>用来传输和存储数据
——没有预定义的标签
——对html的补充
描述:独立于软件和硬件的信息传输工具
python对xml的解析:
- SAX:事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件
- DOM:将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML
- ElementTree:轻量级的DOM
对比:DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)
python使用SAX解析xml
SAX是一种基于事件驱动的 API,牵涉到两个部分: 解析器和事件处理器。
- 解析器:读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
- 事件处理器:负责对事件作出响应,对传递的XML数据进行处理。
引入:import xml.sax
继承基类,自定义相关的类
init
方法
ContebtHandler
类方法
characters(content)
:内容事件处理
startDocument()
:文档启动的时候调用
endDocument()
:解析器到达文档结尾时调用
startElement(name, attrs)
:遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典
endElement(name)
:遇到XML结束标签时调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
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 = "" def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" title = attributes["title"] print "Title:", title 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 = "" 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__"): parser = xml.sax.make_parser() parser.setFeature(xml.sax.handler.feature_namespaces, 0) Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")
|