XML可扩展标记语言
特点:与操作系统,编程语言的开发平台无关
实现不同系统之间的数据交换
作用:数据交互
配置应用程序和网站
节点自由扩展
XML文档结构
声明:<?xml version="1.0"encoding="UTF-8"?>
文档元素描述信息(文档结构)
XML标签: XML文档内容由一系列标签元素组成
<元素名 属性名="属性值">元素内容</元素名>
标签编写注意事项:
所有XML元素都必须有结束标签
注意大小写
嵌套
同级标签缩进
元素名称中不能含空格可以包含字母,数字或其他字符,但不能以数字或标点符号开始
Python中提供的XML解析方式:(三种)
方法:SAX
特点:SAX解析通过流模式在解析XML的过程中触发对应的事件(start_element,char_data,end_element)并调用用户定义的回调函数来处理XML文件。
方法:ElementTree
特点:类似一个轻量级的DOM
方法:DOM
特点:将XML数据在内存中解析成一个树,通过对树的操作来操作XML,占用内存大,解析速度慢,优点是可以任意遍历树的节点
ElementTree的使用方法如下:
tag标签 attrib属性,字典形式保存 text文本字符串
1先加载文档到内存里 形成一个倒装的结构
tree=ET.parse('mingming.xml')
2获取根节点
root=tree.getroot()
import xml.etree.ElementTree as ET
tree=ET.parse('mingming.xml')
root=tree.getroot()
mingming={}
print('tag:',root.tag,'attrib:',root.attrib,'text:',root.text)
for ele in root:
value=[]
for e in ele:
if e.text is None:
value.append(e.attrib)
else:
value.append({e.tag:e.text})
mingming[ele.attrib['name']]=value
print(mingming)
查找指定的子节点:
find('nodeName'):查找第一个tag为nodeName的节点
findall('nodeName'):所有tag为nodeName的节点
删除指定的节点及保存:
remove(node)方法
SAX的使用方法如下:
SAX是事件驱动的xml解析的标准接口。子类化xml.sax.ContentHandler来创建自己的ContentHandler
characters(text)方法通过参数text传递XML文件的字符数据
以startDocument 和endDocument开头和结尾
使用到的方法有:(三种)
make_parser()方法
parse()方法
parseString方法
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
#清空 缓冲区
self.description = content
if ( __name__ == "__main__"): #程序代码入口
# create an XMLReader #创建
parser = xml.sax.make_parser()
# turn off namepsaces #工作目录 工作空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")