1.什么是XML?
a) XML 指可扩展标记语言(eXtensibleMarkupLanguage)。
b)XML 被设计用来传输和存储数据。
2.XML语法
a) XML 必须包含根元素,它是所有其他元素的父元素,就像下面这个中 students 就是根元素:
<?xml version="1.0" encoding="utf-8" ?>
<students>
<student>
<name>石旭辉</name>
<sex>男</sex>
<age>13</age>
<height>2.33</height>
<score>128</score>
</student>
b)所有的 XML 元素都必须有一个关闭标签!
c)XML 必须正确嵌套
d)开始部分: <?xml version=”1.0”encoding=”utf-8”>
e)标签成对出现,并且区分大小写
f)可以有属性,只能有一个根节点!!!
3.python对XML的解析
python有三种方法解析XML,分别是 DOM,SAX,以及ElementTree
4.ContentHandler类方法的介绍
characters(content)方法
调用时机:
从行开始,遇到标签之前,存在字符,content的值为这些字符串; 从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串; 从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串; 标签可以是开始标签,也可以是结束标签。
startDocument()方法:文档启动的时候调用。
endDocument()方法:解析器到达文档结尾时调用。
startElement(name, attrs)方法:遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
endElement(name)方法:遇到XML结束标签时调用。
5.访问和操作XML的方法
(1)获取元素
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
txt=x.nodeValue
( 2 )获取属性的值
txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");
(3)删除元素
removeChild() 方法删除指定的节点(或元素)。
x=xmlDoc.getElementsByTagName("book")[0];
x.removeChild(x.childNodes[0]);
下面我们做个练习
关于学生的信息情况:分别用三种解析方式去解析
(1)第一种是DOM解析
from xml.dom.minidom import parse #第一步必须要先导入模块
class Student: #第二步去定义一个类
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def __str__(self):
return "姓名:{0} 性别:{1} 年龄:{2}".format(self.name,self.sex,self.age)
student1 = [] #定义一个空列表
doc = parse("学生对象信息.xml")
root = doc.documentElement #从文档中获取根节点
#print(root)
students = root.getElementsByTagName("student")
#print(students)
for p in students:
student = Student(p.getElementsByTagName("name")[0].childNodes[0].data,p.getElementsByTagName("sex")[0].childNodes[0].data,p.getElementsByTagName("age")[0].childNodes[0].data)
student1.append(student)
for p in student1:
print(p)
(2)第二种是SAX解析
from xml.sax import ContentHandler
from xml.dom.minidom import parse
class Student:
def __init__(self,name =None,sex = None,age = None):
self.name = name
self.sex = sex
self.age = age
def __str__(self):
return "姓名:{0} 性别:{1} 年龄:{2}".format(self.name,self.sex,self.age)
student1 = []
class mysaxxml(ContentHandler):
def __init__(self):
self.tag=None #为什么要这么写???
self.stu=None
def startDocument(self):
print("startdocument...")
def startElement(self, name, attrs):
self.tag = name
if name =="student":
self.stu = Student()
def characters(self, content):
if self.tag =="name":
self.stu.name=content
if self.tag =="sex":
self.stu.sex=content
if self.tag =="age":
self.stu.age=content
def endElement(self, name):
if name == "student":
student1.append(self.stu)
self.stu = None
self.tag = None #此处为何这么放置 self.tag = None ??
def endDocument(self):
print("endDocument.......")
sts = mysaxxml()
parse("学生对象信息.xml",sts)
for p in student1:
print(p)
(3)第三种 ElementTree 元素树解析from xml.etree.ElementTree import *
class Student:
def __init__(self,name = None,sex = None,age = None):
self.name = name
self.sex = sex
self.age = age
def __str__(self):
return "姓名:{0} 性别:{1} 年龄:{2}".format(self.name,self.sex,self.age)
people = []
root = parse("学生对象信息.xml")
student1 = root.findall("student")
for p in student1:
student = Student()
student.name = p.find("name").text
student.sex = p.find("sex").text
student.age = p.find("age").text
people.append(student)
for p in people:
print(p)