什么是XML
.xml指可扩展标记语言(EXtensible Markup Language)。
.xml是一种标记语言,很类似HTML。
.xml的设计宗旨是传输数据,而非显示数据。
.xml的标签需要我们自行定义。
.xml被设计为具有自我描述性。
.xml是w3c的推荐标准。
XML和HTML的区别
XML:是可扩展标记语言,被设计为传输和存储数据,其焦点是数据的内容。
HTML:是超文件标记语言,主要是显示数据以及如何更好显示数据。
HTML DOM:文档对象模型,通过HTML DOM,可以访问所有的HTML元素,连同它们所包含的文本和属性。可以对其中的内容进行修改,
和删除,同时也可以创建新的对象。
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。
3.ElementTree(元素树):
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,
消耗内存少。
三种优缺点比较:
因DOM需要将XML数据映射到内存中的树,一是比较慢,二是浪费内存,而SAX流式读取XML文件,
比较快,占用内存少,但需要用户实现回调函数(handler)
Python使用SAX解析XML:
SAX是一种基于事件驱动的API。
利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发生事件,如元素的开始跟元素结束事件。
而事件处理器则负责对事件做出相应,对传递的XML数据进行处理。
1.对大型文件进行处理。
2.只需要文件的部分内容,或者只需要从文件中得到特定的信息。
3.想建立自己的对象模型的时候。
在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler.
ContentHandler类方法介绍
characters(content)方法
调用时机:
1.从行开始,遇到标签之前,存在的字符,content的值为这些字符串。
2.从一个标签,遇到下一个标签之前,存在的字符,content的值为这些字符串。
3.从一个标签,遇到行结束符之前,存在的字符,content的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
startDocument()方法:
文件启动的时候调用。
endDocument()方法:
解析器到达文档结尾时调用。
startElement(name,attrs)方法:
遇到XML开始标签时调用,name时标签的名字,attrs是标签的属性值字典。
endElement(name)方法:
遇到XML结束标签时调用。
make_parser方法:
以下方法创建一个新的解析器对象并返回。
xml.sax.make_parser([parse_list])
类型说明:
parser_list : 可选参数,解析器列表。
parser方法:
xml.sax.parser(xmlFile,contenthandler[,errorhandler])
参数说明:
xmlFile: xml文件名
contenthandler:必须是一个ContentHandler的对象
errorhandler:如果指定的该参数,errorhandler必须是一个SAX ErrorHandler对象
parseString方法:
parseString方法创建一个XML解析器并解析xml字符串:
xml.sax.parseString(xmlstring,contenthandler[,errorhandler])
参数说明:
xmlstring : xml字符串
contenthandler : 必须是一个ContentHandler的对象
errorhandler : 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
本次使用xml为:
<?xml version="1.0" encoding="UTF-8" ?>
<persons desc="This is Person">
<person id="p01">
<name>张三</name>
<age>18</age>
<sex>男</sex>
</person>
<person id="p02">
<name>李四</name>
<age>20</age>
<sex>男</sex>
</person>
<person id="p03">
<name>小红</name>
<age>21</age>
<sex>女</sex>
</person>
<person id="p04">
<name>小明</name>
<age>18</age>
<sex>男</sex>
</person>
</persons>
Python解析XML实例:
#SAX方式:
from xml.sax import parse;
from xml.sax import ContentHandler
class Person():
def __init__(self,name = None,age = None,sex = None):
self.name = name
self.age = age
self.sex = sex
def __str__(self):
return "我的姓名是:{0},我的年龄是:{1},我的性别是:{2}".format(self.name,self.age,self.sex)
persons = []
class saxDemo(ContentHandler):
def __init__(self):
self.person=None
self.tag = None
def startDocument(self):
print("文档启动的时候调用")
# 元素开始调用
def startElement(self, name, attrs):
if name=="person":
#创建对象
self.person = Person()
#读取字符调用
def characters(self, content):
#获得读取到的内容
self.tag = content
#元素结束时调用
def endElement(self, name):
if name == "name":
self.person.name = self.tag
if name == "age":
self.person.age = self.tag
if name == "sex":
self.person.sex = self.tag
if name == "person":
persons.append(self.person)
def endDocument(self):
print("解析器到达文档结尾时调用")
#创建一个 SAX 解析器并解析xml文档:
parse("Person.xml",saxDemo())
for p in persons:
print(p)
输出结果为:
我的姓名是:张三,我的年龄是:18,我的性别是:男
我的姓名是:李四,我的年龄是:20,我的性别是:男
我的姓名是:小红,我的年龄是:21,我的性别是:女
我的姓名是:小明,我的年龄是:18,我的性别是:男
使用xml.dom解析xml
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
python中用xml.dom.minidom来解析xml文件
栗子一枚:
#使用DOM
from xml.dom.minidom import parse
#打开文档
domTree = parse("Person.xml")
#获得文档的内容
collection = domTree.documentElement
#<persons desc="This is Person">
if collection.hasAttribute("desc"):
print("根节点的属性描述是:",collection.getAttribute("desc"))
#在集合中获取所有的人类
persons = collection.getElementsByTagName("person")
#打印每个人的详细信息
for p in persons:
#居中显示
print("详细信息".center(20))
if p.hasAttribute("id"):
print("id:",p.getAttribute("id"))
#获得name所在的节点
name = p.getElementsByTagName("name")[0]
#输出name所在节点的值
print("name:",name.childNodes[0].data)
age = p.getElementsByTagName("age")[0]
print("age:",age.childNodes[0].data)
sex = p.getElementsByTagName("sex")[0]
print("sex:",sex.childNodes[0].data)
使用ElementTree解析XML
需要引入一个模块
import xml.etree.ElementTree as et
栗子一枚:
#使用ElementTree解析XML
import xml.etree.ElementTree as et
class Person():
def __init__(self,name = None,age = None,sex = None):
self.name = name
self.age = age
self.sex = sex
def __str__(self):
return "我的名字是:{0},我今年{1}岁啦,我是一名{2}同学".format(self.name,self.age,self.sex)
#打开文档
root = et.parse("Person.xml")
#查询所有person的的标签
personsTree = root.findall("person")
persons = []
#遍历
for p in personsTree:
#封住数据
person = Person()
person.name = p.find("name").text;
person.age = p.find("age").text;
person.sex = p.find("sex").text;
persons.append(person)
#输出封装的数据
for ps in persons:
print(ps)