xml:1.标签成对出现
2.区分大小写
3.标签要正确嵌套
4.开始部分<?xml version="1.0"encoding="utf-8"?>
5.只能有一个根节点
6.节点可以有属性
创建XML文件
<?xml version="1.0" encoding="utf-8"?>
<xue>
<seng>
<name>xj</name>
<age>18</age>
<sex>男</sex>
<score>80</score>
</seng>
<seng>
<name>xy</name>
<age>17</age>
<sex>男</sex>
<score>88</score>
</seng>
<seng>
<name>hd</name>
<age>16</age>
<sex>男</sex>
<score>88</score>
</seng>
</xue>
1.dom(文档对象模型):把解析的xml整个加载到内存,组织成object树。
from xml.dom.minidom import parse #加入模块
class Xue:
def __init__(self,name,age,sex,score):
self.name = None
self.age = None
self.sex = None
self.score = None
def __str__(self):
return "姓名-{} 年龄-{} 性别-{} 成绩-{}".format(self.name,self.age,self.sex,self.score)
xues = []
#读取XML文件
doc = parse("paper")
#得到根节点
root = doc.documentElement
xue = root.getElementsByTagName("seng")
for i in xue:
a = i.getElementsByTagName("name")[0].childNodes[0].data
b = i.getElementsByTagName("age")[0].childNodes[0].data
c = i.getElementsByTagName("sex")[0].childNodes[0].data
d= i.getElementsByTagName("score")[0].childNodes[0].data
xues = Xue(a,b,c,d)
print(xues)
结果: 姓名-xj 年龄-18 性别-男 成绩-80
姓名-xy 年龄-17 性别-男 成绩-88
姓名-hd 年龄-16 性别-男 成绩-88
2.sax:事件驱动式解析,不会在内存中加载整个文档,只会根据自己编写的事件保存数据。
from xml.sax import ContentHandler #导入模块
from xml.sax import parse #读取文件模块
class Xue:
def __init__(self,name,age,sex,score):
self.name = name
self.age = age
self.sex = sex
self.score = score
def __str__(self):
return "姓名-{} 年龄-{} 性别-{} 成绩-{}".format(self.name,self.age,self.sex,self.score)
xuer = []
class Xues(ContentHandler):
def __init__(self):
self.seng = None
self.tag = None
def startDocument(self):
print("开始")
def startElement(self, name, attrs):
self.tag = name
if name == "seng":
self.seng = Xue()
def characters(self, content):
if self.tag == "name":
self.seng.name = content
if self.tag == "age":
self.seng.age = content
if self.tag == "sex":
self.seng.sec = content
if self.tag == "score":
self.seng.score = content
def endElement(self, name):
if name == "seng":
xuer.append(self.sheng)
self.sheng = None
self.tag = None
def endDocument(self):
print("结束")
xues = Xues()
parse("paper",xues)
for i in xuer:
print(i)
元素树解析
from xml.etree.ElementTree import *
class Xue:
def __init__(self,name,age,sex,score):
self.name = name
self.age = age
self.sex = sex
self.score = score
def __str__(self):
return "姓名-{} 年龄-{} 性别-{} 成绩-{}".format(self.name,self.age,self.sex,self.score)
rood = parse("xml.xml")
xue = rood.findall("seng")
xues = []
for i in xue:
seng = Xue()
seng.name = i.find("name").text
seng.age = i.find("age").text
seng.sex = i.find("sex").text
seng.score = i.find("score").text
xues.append(seng)
for n in xues:
print(n)