什么是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
-
- students = root.getElementsByTagName("student")
-
- 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
- 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)