xml:
可扩展标记语言。标签形式展现,标签内名字可随意定义,属于HTML的一种,用于配置文件,可以用浏览器打开查看
根节点 只能有一个 开始和结束 子节点可带属性
1.标签成对出现
2.区分大小写
3.标签要正确嵌套
4.开始部分<?xml version="1.0" encoding="utf-8"?>
5.只能有一个根节点
6.节点可以有属性
DTD:
(Document(文档) Type(类型) Definition(文件))规定怎样去写 约束XML的节点
<!DOCTYPE (根节点)[
<!ELEMENT 根节点(子节点+)>——元素 +至少出现一次或多次
<!ELEMENT 子节点(子节点属性1,2,3)>
<!ELEMENT 子节点1(#PCDATA)>
<!ELEMENT 子节点2(#PCDATA)>
<!ELEMENT 子节点3(#PCDATA)>——纯文本
<!ATTLISI 子节点 属性 CDATA #REQUIRED>——属性列表,哪个节点可以有属性,属性值是纯文本 #必须要有的
]>
示例:
<!DOCTYPE books [
<!ELEMENT books (book+)>
<!ELEMENT book (bname,price,author)>
<!ELEMENT bname (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book id CDATA #REQUIRED>
]>
#REQUIRED(必需的), #IMPLIED(不是必需的), #FIXED(属性值是固定的)
点右键validate可以查看有没有错误
可以查DTD文档有具体的属性使用方法
解析:
三种方式解析
1.dom(文档对象模型) :把解析的xml整个加载到内存,组织成object树。
w3cDom dom4j
dom解析案例:
要导入模块: parse解析
form xml.dom.minidom import parse
(先从根节点进行解析,然后子节点,子节点元素)
自定义文档名=parse(“文件名.xml“ /如果同一个文件下)——得到整个XML文档
自定义名称1=文档名.documentElement——得到根节点
自定义列表名=自定义名称2.getElenmentsByTagName(“根节点名称”)——得到子节点属性,
可以循环列表名得到多个子节点中属性的所有元素
for i in 列表名称:
名称1=i.getElementByTagName(“子节点元素名称”)[0].childNodes[0].data ——得到节点内属性元素
#得到子节点第一个元素下 到子节点结束的中间的第一个元素
名称2=i.getElementByTagName(“子节点元素名称”)[0].childNodes[0].data ——得到节点内属性元素
#得到子节点第一个元素下 到子节点结束的中间的第一个元素
属性=i.getAttribute("id") ——得到ID属性值
示例:
from xml.dom.minidom import parse
#用类对象的形式获取 并添加到新的列表中
wenjian=parse('xml1.xml')
print(wenjian)
r=wenjian.documentElement
print(r)
s=r.getElementsByTagName("book")
class lei:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def __repr__(self):
return self.name+"\t"+self.age+"\t"+self.sex+"\t"
list=[]
for i in s:
a=i.getElementsByTagName("bname")[0]
b=i.getElementsByTagName("price")[0]
c=i.getElementsByTagName("author")[0]
aa=a.childNodes[0].data
bb=b.childNodes[0].data
cc=c.childNodes[0].data
lei1=lei(aa,bb,cc)
list.append(lei1)
print(list)
查看:可以直接输出
存储:可以以集合字典的形式存储
2.sax:事件驱动式解析,只解析需要的,不会在内存中加载整个文档,只会根据自己编写的事件保存数据。
sax 解析需要继承ContentHandler并重写其中的方法,ContentHandler类中常用方法如下
导入模块:from xml.sax import ContentHandler, parse
方法 参数 作用 (5个固定方法默认自动执行)
1 startDocument(self ) # 文档启动时调用
2 startElement(self.name,attrs)name:元素名称,attrs:元素属性 #开始标签< 调用
3 charactersself(self,content)content :文本内容 #遇到行首、空格、字符时调用
4 endElement(self,name)元素名称 # 结束标签</ 时调用
5 endDocument(self )# 解析器到达文档结尾时调用
sax 模块常用方法:
make_parser() 创建一个新的解析器对象并返回
parse() 创建一个 SAX 解析器并解析xml文档
parseString() 创建一个XML解析器并解析xml字符串
示例:
from xml.sax import ContentHandler, parse
class lei:
def __init__(self,name=0,age=0,sex=0):
self.name=name
self.age=age
self.sex=sex
def __repr__(self):
return self.name+"\t"+self.age+"\t"+self.sex+"\t"+self.name1
list=[]
class sex(ContentHandler):
lei1=lei()
lei2=lei()
def startDocument(self): #开始方法
print("解析开始 ")
#标签名 整个标签里的元素
def startElement(self, name, attrs): #开始标签< 调用
self.name=name
if name=="book":
self.lei1.name1=(attrs["id"])
#获取字符元素
def characters(self, content): #遇到行首、空格、字符时调用
if self.name=="bname":
self.lei1.name=content
elif self.name=="price" :
self.lei1.age=content
elif self.name=="author" :
self.lei1.sex=content
else:
pass
def endElement(self, name):#结束标签</ 时调用
if name=="book":
list.append(self.lei1)
self.name=0
def endDocument(self): #结束方法
print("解析结束")
sex1=sex() #解析器实例对象
parse("xml1.xml",sex1)
#执行解析 要解析的文件,解析器实例对象
print(list)
3.elementTree解析:
ElementTree 在 Python 中有两种实现 :
1 纯 Python 实现:导入xml.etree.ElementTree
2 C 语言实现:导入xml.etree.cElementTree
建议使用 C 语言 实现的 ElementTree,因为它速度更快,占用内存更少
(在程序中导入模块时如果C语言实现的不能使用,再使用纯Python实现的)
导入模块:import xml.etree.cElementTree as ce(重命名)
ElementTree 中 常用方法:
方法 作用
parse(xmlfile) 加载xml文件
fromstring(xmltext) 加载xml文件
findall() 获取指定的所有节点
find() 获取指定的节点
getchildren() 获取儿子节点
getiterator() 获取指定的所有节点,与findall()类似
属性 作用
attrib 获取节点的属性及属性值(以元祖的形式返回)
tag 获取节点名称
text 获取节点的文本值
示例:
import xml.etree.cElementTree as ce
a=ce.parse("xml1.xml")#导入根节点
b=a.findall("book")#得到子节点——列表
list=[]
class lei:
def __init__(self,name=0,age=0,sex=0):
self.name=name
self.age=age
self.sex=sex
def __repr__(self):
return self.name+"\t"+self.age+"\t"+self.sex+"\t"
for i in b:
lei1=lei()
b1=i.getchildren()#得到每一次项子节点——列表
lei1.name=b1[0].text#得到列表元素
lei1.age=b1[1].text
lei1.sex=b1[2].text
list.append(lei1)
print(list)