0%

python:解析xml(1):SAX

XML

xml:可扩展标记语言

——>用来传输和存储数据

——没有预定义的标签

——对html的补充

描述:独立于软件和硬件的信息传输工具

python对xml的解析:

  1. SAX:事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件
  2. DOM:将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML
  3. ElementTree:轻量级的DOM

对比:DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)

python使用SAX解析xml

SAX是一种基于事件驱动的 API,牵涉到两个部分: 解析器事件处理器

  1. 解析器:读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
  2. 事件处理器:负责对事件作出响应,对传递的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
#!/usr/bin/python
# -*- coding: UTF-8 -*-

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__"):

# 创建一个 XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写 ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )

parser.parse("movies.xml")