1.XML解析

在对xml文件的操作上面主要包含DOM和SAX两种方式,DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。

2.Python DOM 解析XML

create xml file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="001">
<name>Du Liu</name>
<sex>Male</sex>
<subjects>
<math>90</math>
<english>85</english>
</subjects>
</student>
<student id="002">
<name>Lao Zhang</name>
<sex>Female</sex>
<subjects>
<math>100</math>
<english>60</english>
</subjects>
</student>
</students>

使用xml.dom.minidom来解析XML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
from xml.dom.minidom import parse
dom1 = parse("Test.xml")
students = dom1.getElementsByTagName("student")
for student in students:
id = student.getAttribute("id")
name = student.getElementsByTagName("name")[0]
sex = student.getElementsByTagName("sex")[0]
print('ID : %s, Name : %s, Sex : %s' % (id, name.childNodes[0].nodeValue, sex.childNodes[0].nodeValue))
subjects = student.getElementsByTagName("subjects")
for sub in subjects:
math = sub.getElementsByTagName("math")[0]
english = sub.getElementsByTagName("english")[0]
print("Math : %s, English : %s" % (math.childNodes[0].nodeValue, english.childNodes[0].nodeValue))

输出结果:

ID : 001, Name : Du Liu, Sex : Male
Math : 90, English : 85
ID : 002, Name : Lao Zhang, Sex : Female
Math : 100, English : 60

3.Python SAX 解析XML

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理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
import xml.sax
class saxReadXML(xml.sax.ContentHandler):
def __init__(self):
self.currentData = ''
self.id=''
self.name=''
self.sex=''
self.math=''
self.english=''
# 元素开始事件处理
def startElement(self, tag, attributes):
self.currentData = tag
if tag == "student":
id = attributes["id"]
print("ID : %s" % id)
# 元素结束事件处理
def endElement(self, tag):
if(tag == "name"):
print("Name : %s" %self.name)
if(tag == "sex"):
print("Sex : %s" %self.sex)
if(tag == "math"):
print("Math : %s" %self.math)
if(tag == "english"):
print("English : %s" %self.english)
# 内容事件处理
def characters(self, content):
if self.currentData == "name" :
self.name = content
if self.currentData == "sex" :
self.sex = content
if self.currentData == "math" :
self.math = content
if self.currentData == "english" :
self.english = content
if(__name__=="__main__"):
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
Handler = saxReadXML()
parser.setContentHandler( Handler )
parser.parse("Test.xml")

输出结果:

ID : 001
Name : Du Liu
Sex : Male
Math : 90
English : 85
ID : 002
Name : Lao Zhang
Sex : Female
Math : 100
English : 60