什么是XML?
XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习
XML 被设计用来传输和存储数据。
XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。
它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。
XML语法
a) XML 必须包含根元素,它是所有其他元素的父元素,就像下面这个中 students 就是根元素:
- <?xml version="1.0" encoding="utf-8" ?>
- <students>
- <student>
- <name>李明</name>
- <sex>女</sex>
- <age>18</age>
- <height>1.6</height>
- <score>178</score>
- </student>
b)所有的 XML 元素都必须有一个关闭标签!
c)XML 必须正确嵌套
d)开始部分: <?xml version=”1.0”encoding=”utf-8”>
e)标签成对出现,并且区分大小写
f)可以有属性,只能有一个根节点!!!
python对XML的解析
常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。
python有三种方法解析XML,SAX,DOM,以及ElementTree:
1.SAX (simple API for XML )
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
2.DOM(Document Object Model)
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
python使用SAX解析xml
SAX是一种基于事件驱动的API。
利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;
而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。
<psax适于处理下面的问题:< p="" style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', Arial, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">- 1、对大型文件进行处理;
- 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
- 3、想建立自己的对象模型的时候。
在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。
使用xml.dom解析xml
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
(1)第一种是DOM解析
[python] view plain copy
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解析
[python] view plain copy
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 元素树解析
[python] view plain copy
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)